2013-07-11 73 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服务器,我不知道其他软件可能会丢失东西

相关问题