SUBQUERY_NOT_IN¶
subquery_not_in ::=
NOT IN 的这种形式的右手边是一个圆括弧括起来的子查询,它必须只返回一列.左手边表达式对子查询的结果的每一行进行一次计算和比较.如果只出现不等于子查询行的情况,那么 NOT IN 的结果就是 TRUE.(包括子查询没有返回任何行的特殊例子).如果找到相等行,那么结果是 FALSE.
请注意如果左手边表达式生成 NULL,或者没有相等的右手边数值,并且至少有一个右手边行生成 NULL,那么 NOT IN 构造的结果将是 NULL,而不是 TRUE.这个行为是遵照 SQL 处理布尔和 NULL 值组合时的规则定的.
和 EXISTS 一样,假设子查询将被运行完全是不明智的.
subquery_not_in ::=
这种形式的 NOT IN 的右手边是一个圆括弧括起来的子查询,它必须返回和左手边表达式列表中完全一样多的字段.左手边表达式就子查询结果的每一行进行计算和比较.如果只存在不相等的子查询行,则 NOT IN 的结果为 TRUE. (包括子查询不返回行的特殊例子). 如果找到任何相等行,那么结果为 FALSE.
通常,表达式或者子查询行里的 NULL 是按照 SQL 布尔表达式的一般规则进行组合的.如果两个行对应的成员都是非空并且相等,那么认为这两行相等;如果任意对应成员为非空且不等,那么该两行不等;否则这样的行比较的结果是未知(NULL).如果所有行的结果要么是不等,要么是 NULL,并且至少有一个 NULL,那么 NOT IN 的结果是 NULL
如用以下的查询可以选择出系统中所有未建索引的表:
select * from sys_class
where relkind = 'r' and oid not in (select indrelid from sys_index);