我尝试使用以下查询并对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
条件。
答案 0 :(得分:3)
指定要测试行是否存在的子查询。
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 );