【发布时间】:2018-04-05 02:48:50
【问题描述】:
在下面的查询中,我希望获取每个 USERID 的 SEQNBR 字段的 MAX 值,其中 USERID 没有 STATUS 值为“CLE”的行。
我能够检索每个 USERID 的 MAX SEQNBR Row,但它不排除 USERID 在表中有一行值为“CLE”的情况下。
由于查询最终将运行的环境中的限制,我想避免在 SELECT 子句中使用公用表表达式 (CTE) 和子查询。
SELECT A.USERID, (CONVERT(CHAR(10),A.TEST_DT,121))AS 'TEST_DATE', A.TYPE_CD,
(CONVERT(CHAR(10),A.NEXT_TEST_DT,121))AS 'EXPIRE_DATE', B.STATUS1,
B.MGR_CLR, B.COMMENT, C.COMPANY, D.DESCR, E.DESCR,
F.LAST_NAME, F.FIRST_NAME, B.SEQNBR
FROM ((((((TEST_PLACEMENT A
LEFT OUTER JOIN TEST_STATUS B ON B.USERID = A.USERID AND B.TEST_DT
= A.TEST_DT )
LEFT OUTER JOIN (PS_JOB C INNER JOIN PS_EMPLMT_SRCH_QRY C1 ON (C.USERID =
C1.USERID AND C.EMPL_RCD = C1.EMPL_RCD )) ON
C.USERID = A.USERID )
LEFT OUTER JOIN PS_JOBCODE_TBL D ON D.JOBCODE = C.JOBCODE )
LEFT OUTER JOIN PS_DEPARTMENT_VW E ON E.DEPTID = C.DEPTID )
LEFT OUTER JOIN (PS_JOB G INNER JOIN PS_EMPLMT_SRCH_QRY G1 ON (G.USERID =
G1.USERID AND G.EMPL_RCD = G1.EMPL_RCD )) ON
G.POSITION_NBR = C.REPORTS_TO AND G.EFFDT = (SELECT MAX( H.EFFDT)
FROM PS_JOB H, PS_EMPLMT_SRCH_QRY H1
WHERE H.USERID = H1.USERID
AND H.EMPL_RCD = H1.EMPL_RCD
AND ( G.POSITION_NBR = H.POSITION_NBR )) )
LEFT OUTER JOIN (PS_NAMES F INNER JOIN PS_PERALL_SEC_QRY F1 ON (F.USERID =
F1.USERID )) ON F.USERID = A.USERID )
WHERE ( (
C.JOB_INDICATOR = 'P'
AND B.SEQNBR =
(SELECT MAX(BB.SEQNBR) FROM TEST_STATUS BB
WHERE BB.USERID = B.USERID AND BB.STATUS1 <> 'CLE')
--GROUP BY BB.STATUS1)
AND G.EFFSEQ =
(SELECT MAX(G_ES.EFFSEQ) FROM PS_JOB G_ES
WHERE G.USERID = G_ES.USERID
AND G.EMPL_RCD = G_ES.EMPL_RCD
AND G.EFFDT = G_ES.EFFDT) )))
有问题的代码是:
(AND B.SEQNBR =
(SELECT MAX(BB.SEQNBR) FROM TEST_STATUS BB
WHERE BB.USERID = B.USERID AND BB.STATUS1 <> 'CLE')
--GROUP BY BB.STATUS1))
这是现在主查询中的示例数据:
以下是期望的结果(基于上面的原始示例):
如您所见,USERID 的 1 和 3 已被删除,因为它们每个都有一个具有“CLE”状态的行,并且 USERID 5 的 SEQNBR 37 的行被删除,因为它不是该 USERID 的 MAX SEQNBR (SEQNBR 38 用于 USERID 5)。
【问题讨论】:
标签: sql sql-server-2012