PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

PG::Error:SELECT DISTINCT, ORDER BY ekspresi harus muncul di daftar pilih

Saya tahu ini adalah pertanyaan yang agak lama, tetapi saya baru saja membaca contoh kecil di kepala saya yang membantu saya memahami mengapa Postgres memiliki batasan yang tampaknya aneh ini pada kolom SELECT DISTINCT / ORDER BY.

Bayangkan Anda memiliki data berikut di tabel Rsvp Anda:

 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

Sekarang Anda ingin mengambil daftar event_ids yang berbeda, diurutkan berdasarkan start_times masing-masing. Tapi di mana harus 1 Pergilah? Haruskah itu datang lebih dulu, karena satu tupel dimulai pada 1 Januari 1970, atau haruskah itu menjadi yang terakhir karena 21 Agustus 2013?

Karena sistem basis data tidak dapat membuat keputusan itu untuk Anda dan sintaks kueri tidak dapat bergantung pada data aktual yang mungkin dioperasikannya (dengan asumsi event_id unik), kami dibatasi untuk memesan hanya dengan kolom dari SELECT klausa.

Adapun pertanyaan aktual - alternatif untuk jawaban Matthew adalah menggunakan fungsi agregat seperti MIN atau MAX untuk pengurutan:

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

Pengelompokan dan agregasi eksplisit pada start_time mengizinkan database untuk membuat urutan tupel hasil yang tidak ambigu. Namun perhatikan, keterbacaan itu jelas merupakan masalah dalam kasus ini;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kinerja Urutan dan Serial di Postgres-XL

  2. Tolok ukur Meltdown PostgreSQL

  3. Haruskah saya menentukan INDEX dan UNIQUE INDEX?

  4. Hak Istimewa dan Keamanan PostgreSQL - Mengunci Skema Publik

  5. Optimalkan rentang kueri cap waktu Postgres