sql >> Database teknologi >  >> RDS >> Mysql

Fjern duplikerede rækker i en PostgreSQL SELECT-sætning

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.



  1. Hvornår er det tid til at opgradere til SQL?

  2. Fejl ved installation af pg gem, mkmf.rb kan ikke finde header-filer til ruby ​​(Mac OSX 10.6.5)

  3. Få den distinkte sum af en sammenføjet tabelkolonne

  4. Objektorienterede-lignende strukturer i relationelle databaser