代码之家  ›  专栏  ›  技术社区  ›  Jamsandwich

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

  •  0
  • Jamsandwich  · 技术社区  · 6 年前

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

    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,因为表B中有一行是2017年的。

    我希望这个问题是清楚的,但如果不是,请告诉我。

    预期结果如下-

       ID   |   OPEN_DT   |   LINKCREATED   |   RULE_ID
       C    |  2017-01-01 |   NULL          |   NULL
    

    表A中的ID“C”在表B中没有链接。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Wyatt Shipman    6 年前

    您的问题是,您没有在“不存在”中检查最大创建日期:

    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')
    
        2
  •  0
  •   Daniel Marcus    6 年前

    尝试使用“不在”:

    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