Die einfachste Abfrage zum Schreiben ist für MySQL (mit nicht strengen ANSI-Einstellungen). Es wird die nicht standardmäßige Konstruktion verwendet:
SELECT key, value
FROM tableX
GROUP BY key ;
In den letzten Versionen (5.7 und 8.0+), in denen die strengen Einstellungen und ONLY_FULL_GROUP_BY
die Standardeinstellungen verwendet werden, können Sie die ANY_VALUE()
in 5.7 hinzugefügte Funktion verwenden:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Für andere DBMS mit Fensterfunktionen (wie Postgres, SQL-Server, Oracle, DB2) können Sie diese wie folgt verwenden. Der Vorteil ist, dass Sie auch andere Spalten im Ergebnis auswählen können (neben dem key
und value
):
SELECT key, value
FROM tableX
( SELECT key, value,
ROW_NUMBER() OVER (PARTITION BY key
ORDER BY whatever) --- ORDER BY NULL
AS rn --- for example
FROM tableX
) tmp
WHERE rn = 1 ;
Für ältere Versionen der oben genannten und für alle anderen DBMS, eine allgemeine Methode, die fast überall funktioniert. Ein Nachteil ist, dass Sie mit diesem Ansatz keine anderen Spalten auswählen können. Ein weiterer Grund ist, dass Aggregatfunktionen in einigen DBMS (wie Bit, Text, Blobs) mit einigen Datentypen vergleichbar sind MIN()
und mit MAX()
diesen nicht funktionieren:
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL verfügt über einen speziellen Nicht-Standard- DISTINCT ON
Operator, der ebenfalls verwendet werden kann. Optional können Sie ORDER BY
auswählen, welche Zeile aus jeder Gruppe ausgewählt werden soll:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;