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

未引用SQL返回行

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

    我想做的是返回表1中没有在表2-5中引用的每一行,其中CreatedOn在过去90天内。

    SELECT DISTINCT Table1.*
    FROM   Table1
    LEFT OUTER JOIN Table2
        ON Table1.Id = Table2.Table1Id AND DATEADD(DAY, 90, Table2.CreatedOn) >= GETDATE()
    LEFT OUTER JOIN Table3
        ON Table1.Id = Table3.Table1Id AND DATEADD(DAY, 90, Table3.CreatedOn) >= GETDATE()
    LEFT OUTER JOIN Table4
        ON Table1.Id = Table4.Table1Id AND DATEADD(DAY, 90, Table4.CreatedOn) >= GETDATE()
    LEFT OUTER JOIN Table5
        ON Table1.Id = Table5.Table1Id AND DATEADD(DAY, 90, Table5.CreatedOn) >= GETDATE()
    WHERE
        Table2.Table1Id IS NULL
    OR
        Table3.Table1Id IS NULL
    OR
        Table4.Table1Id IS NULL
    OR
        Table5.Table1Id IS NULL
    

    但这似乎又回来了 每一个 从表1中的行,只要我希望它返回(远)更少。我不明白的是如果我运行一个查询 LEFT OUTER JOIN 只有当我试图同时做这些事情的时候,它才会产生预期的结果。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Matt    6 年前

    另一种考虑这一点的方法是使用 NOT EXISTS WHERE 所以:

    SELECT t1.*
    FROM
        Table1 t1
    WHERE
         NOT EXISTS (SELECT 1 FROM Table2 t2 WHERE t1.TableId = t2.TableId AND DATEADD(DAY, 90, t2.CreatedOn) >= GETDATE())
        AND NOT EXISTS (SELECT 1 FROM Table3 t3 WHERE t1.TableId = t3.TableId AND DATEADD(DAY, 90, t3.CreatedOn) >= GETDATE())
        AND NOT EXISTS (SELECT 1 FROM Table4 t4 WHERE t1.TableId = t4.TableId AND DATEADD(DAY, 90, t4.CreatedOn) >= GETDATE())
        AND NOT EXISTS (SELECT 1 FROM Table5 t5 WHERE t1.TableId = t5.TableId AND DATEADD(DAY, 90, t5.CreatedOn) >= GETDATE())