如何在一个查询中使用EXISTS和NOT EXISTS?

3

表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  

现在,我们可以使用以下查询语句找到表2中存在的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

但我还想检查第三个表中是否存在这些记录。使用一个更多的条件 NOT EXISTS 在同一个查询中?

例如 Table3 现在只有一个 Table1_ID 列值为 1,现在新的 NOT exist 查询应该给我结果为 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。

1个回答

12

条件:

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
            <b>Table3.Table1_ID = Table1.Id</b> -- New
    );

演示:db<>fiddle


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接