PostgreSQL tillader i øjeblikket ikke tvetydige GROUP BY
sætninger, hvor resultaterne er afhængige af den rækkefølge, tabellen scannes, den anvendte plan osv. Det er sådan, standarden siger, at det skal fungere AFAIK, men nogle databaser (som MySQL-versioner før 5.7) tillader løsere forespørgsler, der bare vælger den første værdi stødt på elementer, der vises i SELECT
liste, men ikke i GROUP BY
.
I PostgreSQL skal du bruge DISTINCT ON
for denne form for forespørgsel.
Du vil skrive noget som:
SELECT DISTINCT ON (anwendung.name) anwendung.name, autor.entwickler
FROM author
left join anwendung on anwendung.name = autor.anwendung;
(Syntaks korrigeret baseret på opfølgende kommentar)
Dette er lidt ligesom MySQL 5.7's ANY_VALUE(...)
pseudo-funktion for group by
, men omvendt - det siger, at værdierne i distinct on
klausul skal være unik, og enhver værdi er acceptabel for kolonnerne ikke specificeret.
Medmindre der er en ORDER BY
, er der ingen garanti for, hvilke værdier der er valgt. Du skal normalt have en ORDER BY
for forudsigelighed.
Det er også blevet bemærket, at man bruger et aggregat som min()
eller max()
ville virke. Selvom dette er sandt - og vil føre til pålidelige og forudsigelige resultater, i modsætning til at bruge DISTINCT ON
eller en tvetydig GROUP BY
- det har en ydelsesomkostning på grund af behovet for ekstra sortering eller aggregering, og det virker kun for ordinære datatyper.