我正在尝试编写一个SQL查询,如果它与TableB至少有一个匹配,我将从TableA中排除一条记录。
我已经写了一些代码,如下所示,几乎可以得到我需要的东西 -
SELECT a.ID,
a.OPEN_DT,
b.LINKCREATED,
b.RULE__ID
FROM TableA a
LEFT JOIN TableB b
ON a.ROW_WID = b.A_ROW_WID
WHERE EXTRACT(YEAR FROM a.OPEN_DT) >= '2013'
AND NOT EXISTS (SELECT *
FROM TableB
WHERE A_ROW_WID = a.ROW_WID
AND EXTRACT(YEAR FROM b.CREATED) >= '2017')
;
表A
ROW_WID | ID | OPEN_DT
---------------------------------
1 | A | 2013-01-01
2 | B | 2014-01-01
3 | C | 2017-01-01
表B
RULE_ID | A_ROW_WID | LINKCREATED
---------------------------------
1 | A | 2014-01-01
2 | A | 2017-01-01
3 | B | 2017-01-01
上面的查询将返回ROW_WID = 1的1行,ROW_WID = 2的1行,ROW_WID = 3的任何内容。
我希望我的查询完全排除ROW_WID = 1,因为TableB中有一行有2017年。
我希望这个问题很明确,但如果没有,请告诉我。
- 编辑 -
预期结果将如下所示 -
ID | OPEN_DT | LINKCREATED | RULE_ID
C | 2017-01-01 | NULL | NULL
作为ID' C'来自TableA在TableB中没有链接。
如果A中的条目在2017年之前在B中有任何链接,则会返回它们。只是没有TableB条目> = 2017。
答案 0 :(得分:1)
您的问题是您没有在NOT EXISTS中检查最大创建日期:
SELECT a.ID,
a.OPEN_DT,
b.LINKCREATED,
b.RULE__ID
FROM TableA a
LEFT JOIN TableB b
ON a.ROW_WID = b.A_ROW_WID
WHERE EXTRACT(YEAR FROM a.OPEN_DT) >= '2013'
AND NOT EXISTS (SELECT 'NE'
FROM TableB B2
WHERE A_ROW_WID = a.ROW_WID
AND B2.LINKCREATED= (SELECT MAX(BE.LINKCREATED) FROM TableB BE WHERE B2.A_ROW_WID=BE.A_ROW_WID)
AND EXTRACT(YEAR FROM b2.CREATED) >= '2017')
答案 1 :(得分:0)
尝试不使用:
SELECT a.ID,
a.OPEN_DT,
b.LINKCREATED,
b.RULE__ID
FROM TableA a
LEFT JOIN TableB b
ON a.ROW_WID = b.A_ROW_WID
WHERE EXTRACT(YEAR FROM a.OPEN_DT) >= '2013'
AND b.rule_id not in (select rule_id from TableB where A_ROW_WID in (SELECT
A_ROW_WID
FROM TableB
WHERE EXTRACT(YEAR FROM b.CREATED) >= '2017')a)b