Where
SQL column=ALL(query):等價含義
我知道表達式:
WHERE column <> ALL(subquery)
可以寫成:
WHERE column NOT IN(subquery)
什麼等價於
WHERE column = ALL(subquery)
我認為支持
ALL
運算符的 SQL 方言之間不會有任何差異。
如果沒記錯,您可以使用不存在謂詞並在子查詢中否定運算符 ALL。就像是:
SELECT ... FROM T WHERE T.x = ALL ( select y from U )
對應於
SELECT ... FROM T WHERE NOT EXISTS ( select 1 from U WHERE NOT T.x = U.y )
是的
WHERE NOT EXISTS ( select 1 from U WHERE T.x <> U.y )
換句話說,要
= 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 )
和:
with t (n) as ( values (1),(1),(2) ) select * from t where n = all (select n from t)
兩者都返回 0 行。然而:
with t (n) as ( values (1),(1),(2),(null) ) select * from t where n = all (select n from t)
返回 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 )
返回 1 行。
三有效邏輯使事情變得更加複雜,並且在進行查詢重寫時需要比平時更加小心。
FWIW,有一個非常有趣的項目將同倫類型理論(HoTT)應用於偽 SQL:
http://cosette.cs.washington.edu/
這個想法是能夠證明兩個查詢是否等價,如果不等價,則提供一個不等價的例子。任何採用這種 SQL 方言的供應商肯定會有一個殺手級應用程序。
WHERE column = ALL(subquery)
這是一個相對無用的結構,這就是為什麼它是一個很好的問題並且很少見。等價是一種屬性。沒有理由它必須有意義,有時它沒有。例如。
SELECT '{-0,+0}'::float[]; float8 -------- {-0,0} (1 row)
零以兩種不同的方式儲存。然而 IEEE 754 規定它們必須與 0 進行比較。
-- returns true. SELECT 0::float = ALL('{-0,+0}'::float[]);
大多數數據庫都力求永遠不要讓兩個不同的事情在相等測試中返回 true,因為它增加了衝突的機會。但是,
ALL
不僅適用於=
,例如這也是完全有效的,SELECT 'fooBar' ILIKE ALL(ARRAY['%bar', 'foo%']);