sql >> Database >  >> RDS >> PostgreSQL

PG::Fout:SELECT DISTINCT, ORDER BY-uitdrukkingen moeten in de selectielijst verschijnen

Ik weet dat dit een nogal oude vraag is, maar ik heb net een klein voorbeeld doorgenomen in mijn hoofd dat me hielp begrijpen waarom Postgres deze schijnbaar vreemde beperking heeft op SELECT DISTINCT / ORDER BY-kolommen.

Stel je voor dat je de volgende gegevens in je Rsvp-tabel hebt:

 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

Nu wil je een lijst met verschillende event_ids pakken, geordend op hun respectievelijke start_times. Maar waar moet 1 Gaan? Moet het eerst komen, omdat de ene tupel op 1 januari 1970 begint, of moet het als laatste doorgaan vanwege de 21 augustus 2013?

Aangezien het databasesysteem die beslissing niet voor u kan nemen en de syntaxis van de query niet kan afhangen van de daadwerkelijke gegevens waarop deze mogelijk werkt (ervan uitgaande dat event_id is uniek), zijn we beperkt tot het bestellen van alleen op kolommen uit de SELECT clausule.

Wat betreft de eigenlijke vraag - een alternatief voor Matthew's antwoord is het gebruik van een aggregatiefunctie zoals MIN of MAX voor het sorteren:

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

De expliciete groepering en aggregatie op start_time sta de database toe om met een eenduidige volgorde van de resultaat-tupels te komen. Merk echter op dat leesbaarheid in dit geval zeker een probleem is;)



  1. Controleer of de tabel bestaat in SQL Server

  2. Pseudo-kolommen gebruiken met een gekoppelde server

  3. Hoe NTILE() werkt in SQL Server

  4. EM12c staat nu DB12c toe voor repo's