PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PG::Błąd:SELECT DISTINCT, ORDER BY wyrażenia muszą pojawić się na liście wyboru

Wiem, że to dość stare pytanie, ale właśnie przejrzałem w głowie mały przykład, który pomógł mi zrozumieć, dlaczego Postgres ma to pozornie dziwne ograniczenie w kolumnach SELECT DISTINCT / ORDER BY.

Wyobraź sobie, że masz w tabeli Rsvp następujące dane:

 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

Teraz chcesz pobrać listę różnych identyfikatorów zdarzeń, uporządkowanych według odpowiednich czasów rozpoczęcia. Ale gdzie powinien 1? iść? Czy powinien pojawić się jako pierwszy, ponieważ jedna krotka zaczyna się 1 stycznia 1970 roku, czy też powinien być ostatni z powodu 21 sierpnia 2013 roku?

Ponieważ system bazy danych nie może podjąć tej decyzji za Ciebie, a składnia zapytania nie może zależeć od rzeczywistych danych, na których może działać (zakładając, że event_id jest unikalny), jesteśmy ograniczeni do zamawiania tylko według kolumn z SELECT klauzula.

Jeśli chodzi o samo pytanie - alternatywą dla odpowiedzi Mateusza jest użycie funkcji agregującej, takiej jak MIN lub MAX do sortowania:

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

Wyraźne grupowanie i agregacja w start_time zezwól bazie danych na jednoznaczną kolejność krotek wynikowych. Pamiętaj jednak, że czytelność jest zdecydowanie problemem w tym przypadku;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak skonfigurować replikację klastrów do klastrów dla PostgreSQL

  2. dobry klient postgresql dla systemu Windows?

  3. Błąd Ruby/PgSQL przy starcie Railsów:nie można załadować takiego pliku -- pg_ext (LoadError)

  4. Najlepsze narzędzia ETL do migracji do PostgreSQL

  5. jak mogę utworzyć nowy plik XML z istniejącej bazy danych w bazie danych PostgreSQL za pomocą java?