使用 JdbcTemplate 时使用 IN 子查询作为条件时,带有子句 "START WITH" 的分层查询不起作用
Hierarchical Query with clause "START WITH" not work when use IN subquery as condition when using JdbcTemplate
我有查询要查找低于目标员工的一个上层团队领导的团队的任何成员,并使用如下查询在 DBeaver 进行测试
WITH HIERARCHICAL_TB AS (
SELECT
LEVEL as "XLEVEL"
, t.EMP_ID as "EMP_ID"
, t.NAME
, t.JOB_POS_ID as "JOB_CD"
, t.TEAM_ID
, t.TEAM_PARENT_ID
, 'TEAM_TREE' as "FOUND_AT"
, PRIOR t.EMP_ID as "PRIOR_EMP_ID
, PRIOR t.TEAM_ID as "PRIOR_TEAM_ID
, PRIOR t.TEAM_PARENT_ID as "PRIOR_TEAM_PARENT_ID
FROM
TB_EMPLOYEE t
START WITH
t.TEAM_PARENT_ID IN (
SELECT
b.TEAM_PARENT_ID
FROM
TB_EMPLOYEE b
WHERE
b.EMP_ID IN (:TARGET_EMP)
)
CONNECT BY NOCYCLE
PRIOR TEAM_ID = TEAM_PARENT_ID
AND PRIOR EMP_ID <> EMP_ID
)
SELECT
count(*)
FROM
SELECT
ht.XLEVEL
, ht.EMP_ID
, ht.NAME
, ht.JOB_CD
, ht.PRIOR_EMP_ID as "LEAD_EMP_ID"
FROM
HIERARCHICAL_TB ht
WHERE
ht.NAME like (':SEARCH' || '%')
当 运行 在 DBeaver 上使用正确的数量作为结果时,此查询工作正常但是...
当我在使用 JdbcTemplate 的代码中使用相同的查询时,结果为零。
但是当我用这样的静态值替换子查询时
WITH HIERARCHICAL_TB AS (
SELECT
LEVEL as "XLEVEL"
, t.EMP_ID as "EMP_ID"
, t.NAME
, t.JOB_POS_ID as "JOB_CD"
, t.TEAM_ID
, t.TEAM_PARENT_ID
, 'TEAM_TREE' as "FOUND_AT"
, PRIOR t.EMP_ID as "PRIOR_EMP_ID
, PRIOR t.TEAM_ID as "PRIOR_TEAM_ID
, PRIOR t.TEAM_PARENT_ID as "PRIOR_TEAM_PARENT_ID
FROM
TB_EMPLOYEE t
START WITH
t.TEAM_PARENT_ID IN ('123456','345678')
CONNECT BY NOCYCLE
PRIOR TEAM_ID = TEAM_PARENT_ID
AND PRIOR EMP_ID <> EMP_ID
)
SELECT
count(*)
FROM
SELECT
ht.XLEVEL
, ht.EMP_ID
, ht.NAME
, ht.JOB_CD
, ht.PRIOR_EMP_ID as "LEAD_EMP_ID"
FROM
HIERARCHICAL_TB ht
WHERE
ht.NAME like (':SEARCH' || '%')
第二个查询从 DBerver 和 JdbcTemplate 得到相同的结果。
问题是: 为什么第一个示例查询在 DBeaver 和 JdbcTemplate[=31= 之间得到不同的结果] 因为真正的查询比这些示例更复杂,我想在将查询工具的结果放入代码之前使用可以证明查询工具结果的语句。
我使用 ojdbc8.jar 作为 jdbc 驱动程序,它与我在 DBeaver (v6.3.0)[=31 中使用的相同=]
我的项目使用 spring-boot-starter-jdbc:2.2.2.RELEASE
问题出在这个查询上(正如@AlexPoole 所做的观察)
SELECT
b.TEAM_PARENT_ID
FROM
TB_EMPLOYEE b
WHERE
b.EMP_ID IN (:TARGET_EMP)
问题的原因是b.EMP_ID in table TB_EMPLOYEE包含白色space,在 JdbcTemplate 没有结果,但在 DBeaver 有结果(我仍然不明白为什么 DBeaver 有结果),所以我将查询 b.EMP_ID IN (:TARGET_EMP)
修复为 trim(b.EMP_ID IN (:TARGET_EMP)
.
感谢大家的帮助。
我有查询要查找低于目标员工的一个上层团队领导的团队的任何成员,并使用如下查询在 DBeaver 进行测试
WITH HIERARCHICAL_TB AS (
SELECT
LEVEL as "XLEVEL"
, t.EMP_ID as "EMP_ID"
, t.NAME
, t.JOB_POS_ID as "JOB_CD"
, t.TEAM_ID
, t.TEAM_PARENT_ID
, 'TEAM_TREE' as "FOUND_AT"
, PRIOR t.EMP_ID as "PRIOR_EMP_ID
, PRIOR t.TEAM_ID as "PRIOR_TEAM_ID
, PRIOR t.TEAM_PARENT_ID as "PRIOR_TEAM_PARENT_ID
FROM
TB_EMPLOYEE t
START WITH
t.TEAM_PARENT_ID IN (
SELECT
b.TEAM_PARENT_ID
FROM
TB_EMPLOYEE b
WHERE
b.EMP_ID IN (:TARGET_EMP)
)
CONNECT BY NOCYCLE
PRIOR TEAM_ID = TEAM_PARENT_ID
AND PRIOR EMP_ID <> EMP_ID
)
SELECT
count(*)
FROM
SELECT
ht.XLEVEL
, ht.EMP_ID
, ht.NAME
, ht.JOB_CD
, ht.PRIOR_EMP_ID as "LEAD_EMP_ID"
FROM
HIERARCHICAL_TB ht
WHERE
ht.NAME like (':SEARCH' || '%')
当 运行 在 DBeaver 上使用正确的数量作为结果时,此查询工作正常但是... 当我在使用 JdbcTemplate 的代码中使用相同的查询时,结果为零。
但是当我用这样的静态值替换子查询时
WITH HIERARCHICAL_TB AS (
SELECT
LEVEL as "XLEVEL"
, t.EMP_ID as "EMP_ID"
, t.NAME
, t.JOB_POS_ID as "JOB_CD"
, t.TEAM_ID
, t.TEAM_PARENT_ID
, 'TEAM_TREE' as "FOUND_AT"
, PRIOR t.EMP_ID as "PRIOR_EMP_ID
, PRIOR t.TEAM_ID as "PRIOR_TEAM_ID
, PRIOR t.TEAM_PARENT_ID as "PRIOR_TEAM_PARENT_ID
FROM
TB_EMPLOYEE t
START WITH
t.TEAM_PARENT_ID IN ('123456','345678')
CONNECT BY NOCYCLE
PRIOR TEAM_ID = TEAM_PARENT_ID
AND PRIOR EMP_ID <> EMP_ID
)
SELECT
count(*)
FROM
SELECT
ht.XLEVEL
, ht.EMP_ID
, ht.NAME
, ht.JOB_CD
, ht.PRIOR_EMP_ID as "LEAD_EMP_ID"
FROM
HIERARCHICAL_TB ht
WHERE
ht.NAME like (':SEARCH' || '%')
第二个查询从 DBerver 和 JdbcTemplate 得到相同的结果。
问题是: 为什么第一个示例查询在 DBeaver 和 JdbcTemplate[=31= 之间得到不同的结果] 因为真正的查询比这些示例更复杂,我想在将查询工具的结果放入代码之前使用可以证明查询工具结果的语句。
我使用 ojdbc8.jar 作为 jdbc 驱动程序,它与我在 DBeaver (v6.3.0)[=31 中使用的相同=] 我的项目使用 spring-boot-starter-jdbc:2.2.2.RELEASE
问题出在这个查询上(正如@AlexPoole 所做的观察)
SELECT
b.TEAM_PARENT_ID
FROM
TB_EMPLOYEE b
WHERE
b.EMP_ID IN (:TARGET_EMP)
问题的原因是b.EMP_ID in table TB_EMPLOYEE包含白色space,在 JdbcTemplate 没有结果,但在 DBeaver 有结果(我仍然不明白为什么 DBeaver 有结果),所以我将查询 b.EMP_ID IN (:TARGET_EMP)
修复为 trim(b.EMP_ID IN (:TARGET_EMP)
.
感谢大家的帮助。