我有以下SQL查询:
select * from my_table
然后返回的结果如下:
my_id field_1 field_2 ...
1 ... ...
1 ... ...
1 ... ...
2
3
3
我只想为每个my_id
保留一条记录,也许以field_2
中的最小值记录下来
因此,我期望以下查询失败,因为我没有在select
之后放置所需的聚合函数:
select * from my_table group by my_id order by my_id
但是,查询通过并返回的表没有重复的my_id
。因此,我想知道是否在group by
之前未指定聚合函数的情况下,SQL是否使用默认方法?
答案 0 :(得分:1)
我期望以下查询失败,因为我没有将 所需的聚合..
不幸的是,某些SQL实现允许GROUP BY 没有聚合函数 1 。
在这种情况下,结果为“未定义/定义的实现”-请参阅特定的实现文档以查看其是否提供任何保证。也就是说,尽管仍保证my_id
列是唯一的,但可以为其他输出字段返回任何行的 值 。
(很明显,如果my_id
是键/候选键-但在这种情况下不是-那么这没有什么区别,因为只能选择一行 。 )
要获得更高的兼容性和可预测的结果,请对GROUP BY以外的每个字段使用 聚集函数 -即使特定的SQL / RDBMS不强制执行或“不需要”使用汇总。
1 当原始查询在MySQL(depending on ONLY_FULL_GROUP_BY)中被“接受”时,PostgreSQL和SQL Server都会拒绝“原始查询” “。
答案 1 :(得分:0)
您可以使用相关子查询:
select t.*
from my_table t
where t.field2 = (select min(t2.field2)
from my_table t2
where t2.my_id = t.my_id
);