SQL column=ALL(query):等价的意思

Man*_*ngo 2 where

我知道这个表达:

WHERE column <> ALL(subquery)
Run Code Online (Sandbox Code Playgroud)

可以写成:

WHERE column NOT IN(subquery)
Run Code Online (Sandbox Code Playgroud)

什么是等价的

WHERE column = ALL(subquery)
Run Code Online (Sandbox Code Playgroud)

我认为支持ALL运算符的 SQL 方言之间不会有任何差异。

Len*_*art 5

如果没有记错,您可以使用不存在谓词并否定子查询中的 ALL 运算符。就像是:

SELECT ...
FROM T
WHERE T.x = ALL ( select y from U ) 
Run Code Online (Sandbox Code Playgroud)

对应于

SELECT ...
FROM T
WHERE NOT EXISTS ( select 1 from U
                   WHERE NOT T.x = U.y )
Run Code Online (Sandbox Code Playgroud)

IE

WHERE NOT EXISTS ( select 1 from U
                   WHERE T.x <> U.y )
Run Code Online (Sandbox Code Playgroud)

换句话说,要使谓词= ALL成立,必须NOT EXISTS有一个满足 NOT = 的元组

请注意,如果考虑空值,这可能不成立。例子:

with t (n) as ( values (1),(1),(2) ) 
select * from t as t1 
where not exists (select n from t as t2 where t1.n <> t2.n )
Run Code Online (Sandbox Code Playgroud)

和:

with t (n) as ( values (1),(1),(2) ) 
select * from t where n = all (select n from t)
Run Code Online (Sandbox Code Playgroud)

两者都返回 0 行。然而:

with t (n) as ( values (1),(1),(2),(null) ) 
select * from t where n = all (select n from t)
Run Code Online (Sandbox Code Playgroud)

返回 0 行,而:

with t (n) as ( values (1),(1),(2),(null) ) 
select * from t as t1 where not exists (select n from t as t2 where t1.n <> t2.n )
Run Code Online (Sandbox Code Playgroud)

返回 1 行。

三有效逻辑使事情变得更加复杂,并且在进行查询重写时需要比平时更加​​小心。

FWIW,有一个非常有趣的项目将同伦类型理论(HoTT)应用于伪 SQL:

http://cosette.cs.washington.edu/

这个想法是为了能够证明两个查询是否相等,如果不相等,则提供一个例子,说明它们不相等的情况。任何在 SQL 方言中采用此方法的供应商肯定会拥有一个杀手级应用程序。