首页 > 解决方案 > 如何在一个查询中使用 EXISTS 和 NOT EXISTS?

问题描述

表格1

Id Name  DemoID
1  a      33
2  b      44
3  c      33
4  d      33
5  e      44

表2

Id DemoID IsTrue
11  33     1  
12  44     1

表3

Id Table1_ID
11  1  

现在我们可以使用以下查询找到 Table2 中存在的 DemoID -

SELECT Table1.Id FROM Table1 as Table1
WHERE EXISTS
(
   SELECT * FROM Table2 as Table2
   WHERE Table1.DemoID  = Table2.DemoID AND Table2.IsTrue= 1
)

结果 - 1,2,3,4,5

但我也想检查第三张表这些记录是否存在。在同一个查询中使用一个不存在的条件?

例如Table3Table1_ID列值只有 1 现在新的不存在查询应该给我结果2,3,4,5

我试过像 -

SELECT Table1.Id FROM Table1 as Table1
    WHERE EXISTS
    (
       SELECT * FROM Table2 as Table2
       WHERE Table1.DemoID  = Table2.DemoID AND Table2.IsTrue= 1
    )
AND NOT EXISTS (SELECT * FROM Table3)

但它没有给我任何记录。它应该给我剩下的记录是 2,3,4,5

标签: sql-serversql-server-2012exists

解决方案


条件:

NOT EXISTS (SELECT * FROM Table3)

...如果 Table3 中有任何行,则始终为 false,因此您的查询不返回任何行。

您需要添加一个谓词来显示 Table3 行是如何限定的,如下图粗体所示:

SELECT Table1.Id
FROM Table1 AS Table1
WHERE EXISTS
    (
        SELECT 1 
        FROM Table2 AS Table2
        WHERE
            Table1.DemoID  = Table2.DemoID 
            AND Table2.IsTrue= 1
    )
    AND NOT EXISTS
    (
        SELECT 1
        FROM Table3
        WHERE
            Table3.Table1_ID = Table1.Id -- New
    );

演示:db<>fiddle


推荐阅读