Postgresql当前不允许模棱两可的GROUP BY
语句,其结果取决于表的扫描顺序,使用的计划等。这就是标准说它应该在AFAIK中起作用的方式,但是某些数据库(例如5.7之前的MysqL版本)允许松散的语句。这些查询仅选择出现在SELECT
列表中但不在中的元素遇到的第一个值GROUP BY
。
在Postgresql中,您应该使用DISTINCT ON
这种查询。
SELECT DISTINCT ON (anwendung.name) anwendung.name, autor.entwickler
FROM author
left join anwendung on anwendung.name = autor.anwendung;
(根据后续评论更正了语法)
这有点像MysqL 5.7的ANY_VALUE(...)
伪函数group by
,但是反过来-它表示distinct on
子句中的值必须是唯一的,并且对于 未 指定的列,任何值都是可接受的。
除非有ORDER BY
,否则没有保证选择哪个值。通常,您应该具有ORDER BY
可预测性。
还需要注意的是,使用类似min()
或的聚合是max()
可行的。尽管确实如此-与使用DISTINCT ON
或模棱两可的方法不同GROUPBY
,它会导致可靠和可预测的结果-但由于需要额外的排序或聚合,因此会降低性能,并且仅适用于顺序数据类型。