EXISTS

EXISTS子查询表达式的形如:

exists ::=

EXISTS 的参数是一个任意的SELECT语句,或者说子查询。系统对子查询进行运算以判断它是否返回行。如果它至少返回一行,那么EXISTS的结果就为TRUE;如果子查询没有返回行,那么EXISTS的结果是FALSE。

子查询可以引用来自周围的查询的变量,这些变量在该子查询的任何一次计算中都起常量的作用。

这个子查询通常只是运行到能判断它是否可以生成至少一行为止,而不是等到全部结束.在这里写任何有副作用的子查询都是不明智的 (比如调用序列函数);这些副作用是否发生是很难判断的.

因为结果只取决于是否会返回行,而不取决于这些行的内容,所以这个子查询的输出列表通常是无关紧要的.一个常用的编码习惯是用下面的形式写所有的 EXISTS 测试 EXISTS(SELECT 1 WHERE ...)。不过这条规则有例外,比如那些使用INTERSECT的子查询。

下面这个简单的例子类似在col2 上的一次内联接,但是它为每个 tab1 的行生成最多一个输出,即使存在多个匹配 tab2 的行也如此:

SELECT col1 FROM tab1
WHERE EXISTS(SELECT 1 FROM tab2 WHERE col2 = tab1.col2);