Apabila menggunakan GROUP BY tanpa fungsi agregat, adalah penting untuk memahami cara Oracle beroperasi untuk mengelakkan daripada menghadapi "bukan ungkapan KUMPULAN MENGIKUT" ralat.
KUMPULAN OLEH kumpulan baris dengan nilai yang sama untuk lajur yang ditentukan dan menghasilkan satu baris hasil. Walau bagaimanapun, lajur yang tidak muncul dalam fungsi agregat mesti disertakan dalam klausa GROUP BY untuk mengenal pasti gabungan unik nilai kumpulan.
Pertimbangkan jadual berikut:
EMP +-------+------+------+ | EmpNo | EName | Sal | +-------+------+------+ | 7839 | King | 5000 | | 7698 | Blake | 2850 | | 7782 | Clark | 2450 | +-------+------+------+
Contoh 1:
SELECT EName, Sal FROM EMP GROUP BY EName, Sal
Hasil:
+------+------+ | EName | Sal | +------+------+ | King | 5000 | | Blake | 2850 | | Clark | 2450 | +------+------+
Pertanyaan ini mengumpulkan baris dengan betul dan mengembalikan semua baris sejak lajur pengumpulan (EName dan Sal ) padanan.
Contoh 2:
SELECT EName, Sal FROM EMP GROUP BY EName
Keputusan:
ORA-00979: not a GROUP BY expression
Pertanyaan ini gagal kerana Sal tidak termasuk dalam klausa GROUP BY. Oracle tidak tahu cara mengagregatkan berbilang baris dengan nilai Sal yang berbeza untuk EName yang sama.
Contoh 3:
SELECT EName, Sal FROM EMP GROUP BY Sal
Hasil:
ORA-00979: not a GROUP BY expression
Pertanyaan ini juga gagal kerana EName tidak disertakan dalam KUMPULAN MENGIKUT klausa. Oracle perlu tahu EName mana yang hendak dikaitkan dengan setiap nilai Sal yang unik.
Contoh 4:
SELECT EmpNo, EName, Sal FROM EMP GROUP BY Sal, EName
Hasil:
ORA-00979: not a GROUP BY expression
Pertanyaan ini gagal kerana bilangan lajur pilihan (EmpNo, EName, Sal) melebihi bilangan lajur dalam klausa GROUP BY (Sal, EName). Oracle memerlukan lajur yang dipilih untuk menjadi sebahagian daripada kumpulan, dengan mengambil kira gabungan unik.
Contoh 5:
SELECT EmpNo, EName, Sal FROM EMP GROUP BY EmpNo, EName, Sal
Hasil:
+-------+------+------+ | EmpNo | EName | Sal | +-------+------+------+ | 7839 | King | 5000 | | 7698 | Blake | 2850 | | 7782 | Clark | 2450 | +-------+------+------+
Pertanyaan ini berjaya kerana semua lajur yang dipilih disertakan dalam GROUP BY klausa. Oracle menganggap setiap gabungan unik EmpNo, EName dan Sal, menghasilkan tiga baris yang berbeza.
Atas ialah kandungan terperinci Mengapa Oracle Saya GROUP BY Query Mengembalikan Ralat 'bukan GROUP BY expression'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!