PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PG::Error:SELECT DISTINCT, ORDER BY-Ausdrücke müssen in der Auswahlliste erscheinen

Ich weiß, dass dies eine ziemlich alte Frage ist, aber ich bin gerade ein kleines Beispiel in meinem Kopf durchgegangen, das mir geholfen hat zu verstehen, warum Postgres diese scheinbar seltsame Einschränkung für SELECT DISTINCT / ORDER BY-Spalten hat.

Stellen Sie sich vor, Sie haben die folgenden Daten in Ihrer Rsvp-Tabelle:

 event_id |        start_time
----------+------------------------
    0     | Mar 17, 2013  12:00:00
    1     |  Jan 1, 1970  00:00:00
    1     | Aug 21, 2013  16:30:00
    2     |  Jun 9, 2012  08:45:00

Jetzt möchten Sie eine Liste mit unterschiedlichen event_ids abrufen, die nach ihren jeweiligen start_times geordnet sind. Aber wo sollte 1 gehen? Soll es an erster Stelle stehen, weil das eine Tupel am 1. Januar 1970 beginnt, oder soll es wegen des 21. August 2013 an letzter Stelle stehen?

Da das Datenbanksystem diese Entscheidung nicht für Sie treffen kann und die Syntax der Abfrage nicht von den tatsächlichen Daten abhängen kann, auf denen sie möglicherweise arbeitet (unter der Annahme von event_id eindeutig ist), sind wir darauf beschränkt, nur nach Spalten aus SELECT zu sortieren Klausel.

Was die eigentliche Frage betrifft - eine Alternative zu Matthews Antwort ist die Verwendung einer Aggregatfunktion wie MIN oder MAX für die Sortierung:

  SELECT event_id
    FROM Rsvp
GROUP BY event_id
ORDER BY MIN(start_time)

Die explizite Gruppierung und Aggregation auf start_time erlauben der Datenbank, eine eindeutige Reihenfolge der Ergebnistupel zu finden. Beachten Sie jedoch, dass die Lesbarkeit in diesem Fall definitiv ein Problem darstellt;)