2013-07-11 84 views
11

我使用SQL(SQL Server,PostgreSQL)超過10年,但我從未在生產代碼中使用過ANY/SOMEALL關鍵字。我遇到的所有情況都可以通過INMAX,MIN,EXISTS得到解決,我認爲它更具可讀性。SQL:我們是否需要ANY/SOME和ALL關鍵字?

例如:

-- = ANY 
select * from Users as U where U.ID = ANY(select P.User_ID from Payments as P); 

-- IN 
select * from Users as U where U.ID IN (select P.User_ID from Payments as P); 

或者

-- < ANY 
select * from Users as U where U.Salary < ANY(select P.Amount from Payments as P); 

-- EXISTS 
select * from Users as U where EXISTS (select * from Payments as P where P.Amount > U.Salary); 

使用ANY/SOMEALL

因此問題是:我這麼想嗎?有沒有其他的解決方案照耀ANY/SOMEALL

+1

我在過去的13年中沒有使用過它們。 –

+0

我從來沒有使用'EXCEPT'。我堅持'不存在' – joop

+0

我完全同意這一點,我認爲'EXCEPT'對於找到兩個具有相同模式的表之間的差異很有用 –

回答

13

我發現任何和所有非常有用,當你不只是測試平等或不平等。考慮

'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']); 

as used my answer to this question

ANY,ALL和它們的否定可以極大地簡化本來需要非平凡子查詢或CTE的代碼,並且在我看來,它們明顯不足。

請考慮ANY將與任何運營商合作。它與LIKE~非常方便,但可以與tsquery,陣列成員資格測試,hstore密鑰測試等一起使用。

'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd']) 

或:

'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b']) 

沒有ANYALL你可能有表達作爲那些在VALUES清單,合計產生一個結果子查詢或CTE。當然,如果你願意,你可以這樣做,但我會堅持ANY

這裏有一個真正的警告:在較老的Pg版本中,如果你正在編寫ANY(SELECT ...),你幾乎肯定會在EXISTS (SELECT 1 FROM ... WHERE ...)的性能方面表現更好。如果您使用優化程序將ANY (...)變成加入的版本,那麼您不必擔心。如果有疑問,請檢查EXPLAIN輸出。

+2

+1,但您使用的是什麼RDBMS?我試圖在PostgreSQL中使用你的查詢,並且我可以得到的最好的結果是'like'like(values('%lah'),('%fah'),('%dah'));' [SQL FIDDLE ](http://sqlfiddle.com/#!12/ac24b/9) –

+2

它需要是'ANY(ARRAY [...])'。但是,是的,這通常很有用。 –

+0

@PeterEisentraut呃,好點。我一直認爲它採用與IN相同的簡單文字列表語法(...) –

6

不,我從來沒有使用ANY,ALLSOME關鍵字,我從來沒有見過他們用於其他人的代碼。我認爲這些語法是有意義的語法,就像SQL中某些地方出現的各種可選關鍵字(例如,AS)。

請記住,SQL是由委員會定義的。

+3

+1,但「AS」有什麼問題?我喜歡它:) –

0

我曾嘗試過任何東西,但沒有丟失任何東西,只是當我使用Not條件時,只是不同類型的習慣。存在和將需要添加而不是任何/某些只是將操作員更改爲<>。我只使用SQL服務器,我不知道其他軟件可能會丟失東西

相關問題