更正的一致缺陷:如果将NULL值与使用ALL、ANY或SOME的子查询进行比较,而且子查询返回空结果,比较操作将对NULL的非标准结果进行评估,而不是TRUE或FALSE。
子查询的外部语句可以是SELECT、INSERT、UPDATE、DELETE、SET或DO中的任何一个。
仅部分支持行比较操作:
·对于expr IN (subquery),expr可以是n-tuple(通过行构造程序语法指定),而且子查询能返回n-tuples个行。
·对于expr op {ALL|ANY|SOME} (subquery),expr必须是标度值,子查询必须是列子查询,不能返回多列行。
换句话讲,对于返回n-tuples行的子查询,支持:
(val_1, ..., val_n) IN (subquery) |
但不支持:
(val_1, ..., val_n) op {ALL|ANY|SOME} (subquery)
支持针对IN的行比较,但不支持针对其他的行比较,原因在于,IN实施是通过将其重新编写为“=”比较和AND操作的序列完成的。该方法不能用于ALL、ANY或SOME。
未良好优化行构造程序。下面的两个表达式是等效的,但只有第2个表达式能被优化:
(col1, col2, ...) = (val1, val2, ...) col1 = val1 AND col2 = val2 AND ... |
对于IN的子查询优化不如对“=”的优化那样有效。
对于不良IN性能的一种典型情况是,当子查询返回少量行,但外部查询返回将与子查询结果相比较的大量行。
FROM子句中的子查询不能与子查询有关系。在评估外部查询之前,将对它们进行具体化处理(执行以生成结果集),因此,不能按照外部查询的行对它们进行评估。
一般而言,不能更改表,并从子查询内的相同表进行选择。例如,该限制适用于具有下述形式的语句:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);
|
例外:如果为FROM子句中更改的表使用子查询,前述禁令将不再适用。例如:
UPDATE t ... WHERE col = (SELECT (SELECT ... FROM t...) AS _t ...); |
禁令在此不适用,这是因为FROM中的子查询已被具体化为临时表,因此“t”中的相关行已在满足“t”条件的情况下、在更新时被选中。
最新相关文章
发表评论