EXISTS子句如何在SQL Server中工作?

时间:2016-01-29 09:54:20

标签: sql sql-server

我尝试使用以下查询并对EXISTS子句的工作感到困惑,尽管我知道它会评估TRUE/FALSE

#1以下SQL子查询无论如何返回0,但组合查询的结果仍为1.

1. SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 1 )

2. SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 0 )

另外,如果EXISTS子句评估TRUE/FALSE,那么为什么下面的子句不起作用?

SELECT 1 WHERE EXISTS ( 1 )

请帮助我了解这种情况。

编辑: EXISTS子句评估TRUE/FALSE。  如果子查询返回任何结果,则条件为TRUE。那么为什么EXISTS ( 1 )不起作用?这是TRUE条件。

3 个答案:

答案 0 :(得分:3)

来自文档enter image description here

  

指定要测试行是否存在的子查询。

SELECT 1 
WHERE EXISTS ( SELECT 0 WHERE 1 = 1 )
-- there is row

SELECT 1 
WHERE EXISTS ( SELECT 0 WHERE 1 = 0 )
-- no row returned by subquery

SELECT 1 WHERE EXISTS ( 1 )
-- not even valid query `1` is not subquery

请记住,它检查的行不是值,所以:

SELECT 1 
WHERE EXISTS ( SELECT NULL WHERE 1 = 1 )
-- will return 1

EXISTS

修改

  

这似乎与句子“EXISTS条款评估为TRUE / FALSE”相矛盾?

EXISTS运算符测试是否存在行,并返回TRUE/FALSE

因此,如果子查询返回:

╔══════════╗     ╔══════════╗     ╔══════════╗     ╔══════════╗
║ subquery ║     ║ subquery ║     ║ subquery ║     ║ subquery ║
╠══════════╣     ╠══════════╣     ╠══════════╣     ╠══════════╣
║ NULL     ║     ║ 1        ║     ║ 0        ║     ║anything  ║
╚══════════╝     ╚══════════╝     ╚══════════╝     ╚══════════╝

然后EXISTS (subquery) - > TRUE

如果子查询返回(没有行):

╔══════════╗
║ subquery ║
╚══════════╝

然后EXISTS (subquery) - > FALSE

答案 1 :(得分:1)

当EXISTS中的子查询包含任何行时,EXISTS返回true。逻辑上等效(但不推荐)的重写EXISTS表达式的方法是:

SELECT 1
WHERE (SELECT COUNT(*) FROM 1) > 0

在此重写中,您的上一个查询如下所示:

    public static void SumatraPrint(string pdfFile, string printer)
    {
        var exePath = Registry.LocalMachine.OpenSubKey(
            @"SOFTWARE\Microsoft\Windows\CurrentVersion" +
            @"\App Paths\SumatraPDF.exe").GetValue("").ToString();

        var args = $"-print-to \"{printer}\" {pdfFile}";

        var process = Process.Start(exePath, args);
        process.WaitForExit();
    }
你应该看到的

是没有意义的。

答案 2 :(得分:0)

行为:

Condition          Is true if ...
----------         ------------------
EXISTS             the subquery returns at least one row
NOT EXISTS         the subquery returns no data

用法:

WHERE EXISTS ( subquery );
WHERE NOT EXISTS  ( subquery );