Where

SQL column=ALL(query):等價含義

  • March 30, 2018

我知道表達式:

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%']);

引用自:https://dba.stackexchange.com/questions/202601