sql >> Databasteknik >  >> RDS >> Mysql

Eliminera dubbletter av rader i en PostgreSQL SELECT-sats

PostgreSQL tillåter för närvarande inte tvetydiga GROUP BY satser där resultaten är beroende av den ordning tabellen skannas, planen som används etc. Det är så standarden säger att det ska fungera AFAIK, men vissa databaser (som MySQL-versioner före 5.7) tillåter lösare frågor som bara väljer det första värdet påträffas för element som visas i SELECT lista men inte i GROUP BY .

I PostgreSQL bör du använda DISTINCT ON för den här typen av fråga.

Du vill skriva något som:

SELECT DISTINCT ON (anwendung.name) anwendung.name, autor.entwickler
FROM author 
left join anwendung on anwendung.name = autor.anwendung;

(Syntax korrigerad baserat på uppföljande kommentar)

Det här är lite som MySQL 5.7:s ANY_VALUE(...) pseudo-funktion för group by , men omvänt - det står att värdena i distinct on sats måste vara unik och alla värden är acceptabelt för kolumnerna inte specificerat.

Såvida det inte finns en ORDER BY , det finns ingen garanti för vilka värden som väljs. Du bör vanligtvis ha en ORDER BY för förutsägbarhet.

Det har också noterats att man använder ett aggregat som min() eller max() skulle jobba. Även om detta är sant - och kommer att leda till tillförlitliga och förutsägbara resultat, till skillnad från att använda DISTINCT ON eller en tvetydig GROUP BY - det har en prestandakostnad på grund av behovet av extra sortering eller aggregering, och det fungerar bara för ordinarie datatyper.



  1. Hur får man Django att fungera med MySQL-drivrutiner som inte stöds såsom gevent-mysql eller Concurrences MySQL-drivrutin?

  2. Hur förhindrar man skapande av poster där värdet på två fält är detsamma?

  3. Codeigniter-transaktioner

  4. MySQL JDBC-drivrutin 5.1.33 - Tidszonsproblem