PostgreSQL aktuálně nepovoluje nejednoznačné GROUP BY
příkazy, kde jsou výsledky závislé na pořadí, ve kterém je tabulka naskenována, použitém plánu atd. Takto standard říká, že by to mělo fungovat AFAIK, ale některé databáze (jako MySQL verze starší než 5.7) umožňují volnější dotazy, které pouze vyberou první hodnotu vyskytující se u prvků objevujících se v SELECT
seznamu, ale ne v GROUP BY
.
V PostgreSQL byste měli použít DISTINCT ON
pro tento druh dotazu.
Chcete napsat něco jako:
SELECT DISTINCT ON (anwendung.name) anwendung.name, autor.entwickler
FROM author
left join anwendung on anwendung.name = autor.anwendung;
(Syntaxe opravena na základě následného komentáře)
Je to trochu jako ANY_VALUE(...)
MySQL 5.7 pseudofunkce pro group by
, ale obráceně - říká, že hodnoty v distinct on
klauzule musí být jedinečná a pro sloupce je přijatelná jakákoli hodnota ne specifikováno.
Pokud neexistuje ORDER BY
, neexistuje žádná záruka, jaké hodnoty jsou vybrány. Obvykle byste měli mít ORDER BY
pro předvídatelnost.
Bylo také uvedeno, že použití agregace jako min()
nebo max()
by fungovalo. I když je to pravda – a povede to ke spolehlivým a předvídatelným výsledkům, na rozdíl od použití DISTINCT ON
nebo nejednoznačné GROUP BY
- Má vysoké náklady na výkon kvůli nutnosti dodatečného třídění nebo agregace a funguje pouze pro ordinální datové typy.