我通常使用DBMS的MAX()或MIN()没有ANY()聚合函数。
mySQL和MS-SQL中是否有更便宜的东西?
答案 0 :(得分:3)
是任何限定符,以匹配SOME和ALL
MIN和MAX是正确的聚合......完全不相关,不应该进行比较
编辑:
只有MySQL具有“ANY”聚合的含糊不清:SQL Server,Sybase,Oracle,PostGres都没有。见Do all columns in a SELECT list have to appear in a GROUP BY clause
答案 1 :(得分:2)
MySQL 不需要 ANY()聚合。
如果我做了
SELECT field1, field2, SUM(field3) FROM table1
GROUP BY field2
微软T-SQL会抱怨但
MySQL将默默执行
SELECT whatever(field1), field2, SUM(....
当然比SELECT max(field1), field2, SUM(.... GROUP BY field2
MySQL支持ANY
,但SELECT ANY(field1) ...
不起作用,因为ANY
是一个类似于IN
和ALL
的运算符。
见:http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
我喜欢MySQL
答案 2 :(得分:1)
MIN和MAX同样(昂贵)。
答案 3 :(得分:0)
好的,让我们重新解释原来的问题。如果提供了EXISTS-aggregate函数,那将是很好的,而不是任何不明确而不是SQL标准的ANY。
我曾多次使用“count(outer.column)> 0”模仿“exists(outer.column)”,这可能会更便宜,因为无论如何都会丢弃计数。
答案 4 :(得分:0)
从 MySQL 5.7(2015 年 10 月发布)开始,实际上有一个功能! any_value(col)
明确满足此需求 - 有关详细信息,请参阅 documentation。
但是,需要注意的是,它似乎仍然不能保证短路,仍然可能执行全扫描,因此可能无法达到更高效率的目标。如果 MySQL 对此很聪明,那么就有一些机会,尽管测试是明智的。在两种情况下它可能会有所帮助:
max
或其他占位符聚合可能会使代码中的意图变得不那么明确。例如,max
可能暗示其存在有某种原因,而不是从分组中获取“任何东西”,但 any_value
会明确定义意图,而无需额外注释。玩具样品:
select
col,
any_value(a.val) as any_val
from (
select 'blue' as col, 3 as val
union all
select 'blue' as col, 2 as val
union all
select 'green' as col, 1 as val
) as a
group by col