SUBQUERY_IN

SUBQUERY_IN子查询表达式形如:

subquery_in ::=

IN的这种形式的右手边是一个圆括弧括起来的子查询, 它必须只返回一列。左手边表达式对子查询的结果的每一行进行一次计算和比较。如果找到任何等于子查询行的情况,那么IN的结果就是TRUE。如果没有找到相等行,那么结果是 FALSE(包括子查询没有返回任何行的特殊例子)。

请注意如果左手边表达式生成NULL,或者没有相等的右手边数值,并且至少有一个右手边行生成 NULL,那么IN构造的结果将是 NULL,而不是 FALSE。这个行为是遵照SQL处理布尔和NULL值组合时的规则定的。

和EXISTS一样,在处理IN表达式时子查询也不需要被执行完全,一但在执行过程中发现了一个能与左值匹配的行,即可确定IN表达式的结果为TRUE,子查询也随即停止执行。

SUBQUERY_IN的第二种形式如下:

subquery_in ::=

这种形式的IN的右手边是一个圆括弧括起来的子查询,它必须返回和左手边表达式列表中完全一样多的字段。左手边表达式就子查询结果的每一行进行计算和比较。如果找到任意相等的子查询行,则IN的结果为TRUE。如果没有找到相等行,那么结果为FALSE(包括子查询不返回行的特殊例子)。

通常,表达式或者子查询行里的NULL是按照SQL布尔表达式的一般规则进行组合的。如果两个行对应的成员都是非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么该两行不等;否则这样的行比较的结果是未知(NULL)。如果所有行的结果要么是不等,要么是 NULL,并且至少有一个NULL,那么IN的结果是NULL。

如用以下的查询可以选择出系统中所有建有索引的表:

select * from sys_class where oid in (select indrelid from
sys_index);