Ralat Subkueri SQL: Ungkapan Tunggal dalam Senarai PILIH
Pertanyaan SQL ini menjana ralat:
select count(distinct dNum) from myDB.dbo.AQ where A_ID in (SELECT DISTINCT TOP (0.1) PERCENT A_ID, COUNT(DISTINCT dNum) AS ud FROM myDB.dbo.AQ WHERE M > 1 and B = 0 GROUP BY A_ID ORDER BY ud DESC)
Mesej ralat, "Hanya satu ungkapan boleh ditentukan dalam senarai pilih apabila subkueri tidak diperkenalkan dengan EXISTS," menunjukkan masalah dengan klausa SELECT
subkueri. Subkueri cuba mengembalikan dua lajur: A_ID
dan COUNT(DISTINCT dNum)
. Apabila menggunakan IN
(atau operator perbandingan lain seperti =
, !=
, dsb.), senarai SELECT
subkueri mesti mengandungi hanya satu lajur.
Penyelesaian:
Pertanyaan yang dibetulkan harus kembali hanya A_ID
daripada subkueri:
select count(distinct dNum) from myDB.dbo.AQ where A_ID in (SELECT DISTINCT TOP (0.1) PERCENT A_ID FROM myDB.dbo.AQ WHERE M > 1 and B = 0 GROUP BY A_ID) ORDER BY COUNT(DISTINCT dNum) DESC;
Perhatikan perubahan:
SELECT
subkueri kini hanya termasuk A_ID
.ORDER BY
, yang sebelum ini berada dalam subkueri, telah dialihkan ke pertanyaan luar. Ini kerana ORDER BY
asal sedang cuba mengisih hasil subkueri sebelum digunakan dalam klausa IN
; pengisihan hendaklah digunakan pada set keputusan akhir.Pertanyaan yang disemak ini dengan betul memilih kiraan nilai dNum
yang berbeza dengan A_ID
ditemui dalam hasil subkueri. Subkueri mengenal pasti 10% teratas nilai A_ID
dengan cekap berdasarkan kiraan dNum
yang berbeza, dan pertanyaan luar kemudian mengira nilai dNum
berbeza yang dikaitkan dengan A_ID
yang dipilih. Klausa ORDER BY
akhir mengisih hasil berdasarkan kiraan nilai dNum
yang berbeza.
Atas ialah kandungan terperinci Mengapa Subquery SQL Saya Kembali 'Hanya satu ungkapan boleh ditentukan dalam senarai pilih apabila subquery tidak diperkenalkan dengan EXISTS?'. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!