如果在连接字段中存在特定值,则SQL排除行

时间:2018-05-23 16:03:13

标签: sql plsql oracle11g

我正在尝试编写一个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。

2 个答案:

答案 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