我知道这个表达:
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 方言之间不会有任何差异。
如果没有记错,您可以使用不存在谓词并否定子查询中的 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 方言中采用此方法的供应商肯定会拥有一个杀手级应用程序。
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |