sql >> Databasteknik >  >> RDS >> PostgreSQL

PG::Fel:SELECT DISTINCT, ORDER BY-uttryck måste visas i urvalslistan

Jag vet att det här är en ganska gammal fråga, men jag gick precis igenom ett litet exempel i mitt huvud som hjälpte mig att förstå varför Postgres har denna till synes udda begränsning på SELECT DISTINCT / ORDER BY kolumner.

Föreställ dig att du har följande data i din Rsvp-tabell:

 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 vill du ta en lista över distinkta event_id, sorterade efter deras respektive starttider. Men var ska 1 gå? Ska den komma först, eftersom den ena tupeln börjar den 1 januari 1970, eller ska den gå sist på grund av den 21 augusti 2013?

Eftersom databassystemet inte kan fatta det beslutet åt dig och syntaxen för frågan inte kan bero på de faktiska data som den kan arbeta på (förutsatt att event_id är unik), är vi begränsade till att endast beställa efter kolumner från SELECT klausul.

När det gäller själva frågan - ett alternativ till Matthews svar är att använda en aggregatfunktion som MIN eller MAX för sorteringen:

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

Den explicita grupperingen och aggregeringen på start_time tillåta databasen att komma med en entydig ordning av resultattuplarna. Observera dock att läsbarhet definitivt är ett problem i det här fallet;)



  1. Hur inloggningar fungerar på länkade servrar (T-SQL-exempel)

  2. Multitenancy-alternativ för PostgreSQL

  3. Öka ett databasfält med 1

  4. Förhistorisk och modern metod för designdatabaser