Hanya satu ekspresi yang dapat ditentukan dalam daftar pilih ketika subquery tidak diperkenalkan dengan EXISTS

177

Kueri saya adalah sebagai berikut, dan berisi subquery di dalamnya:

 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)

Kesalahan yang saya terima adalah ...

Only one expression can be specified in the select list when the subquery is not
introduced with EXISTS.`

Ketika saya menjalankan sub-permintaan saja, ia akan kembali dengan baik, jadi saya berasumsi ada beberapa masalah dengan permintaan utama?

rockit
sumber

Jawaban:

230

Anda tidak dapat mengembalikan dua (atau beberapa) kolom dalam subquery Anda untuk melakukan perbandingan dalam WHERE A_ID IN (subquery)klausa - kolom mana yang seharusnya dibandingkan A_ID? Subquery Anda hanya harus mengembalikan satu kolom yang diperlukan untuk perbandingan dengan kolom di sisi lain IN. Jadi kueri harus dalam bentuk:

SELECT * From ThisTable WHERE ThisColumn IN (SELECT ThatColumn FROM ThatTable)

Anda juga ingin menambahkan pengurutan sehingga Anda dapat memilih hanya dari baris atas, tetapi Anda tidak perlu mengembalikan COUNT sebagai kolom untuk melakukan pengurutan; pengurutan dalam ORDERklausa tidak tergantung pada kolom yang dikembalikan oleh kueri.

Coba sesuatu seperti ini:

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)
Chris Latta
sumber
83

Anda harus mengembalikan hanya satu kolom dan satu baris di kueri tempat Anda menetapkan nilai yang dikembalikan ke variabel. Contoh:

select * from table1 where Date in (select * from Dates) -- Wrong
select * from table1 where Date in (select Column1,Column2 from Dates) -- Wrong
select * from table1 where Date in (select Column1 from Dates) -- OK
ShoushouLeb
sumber
2
Itu tidak membantu saya. Memberi saya kesalahan yang sama. Menentukan kolom alih-alih *membantu saya.
Mohammedsalim Shivani
11

Mengeluh tentang

COUNT(DISTINCT dNum) AS ud 

di dalam subquery. Hanya satu kolom yang dapat dikembalikan dari subquery kecuali jika Anda menjalankan kueri yang ada. Saya tidak yakin mengapa Anda ingin melakukan penghitungan pada kolom yang sama dua kali, secara dangkal terlihat berlebihan untuk apa yang Anda lakukan. Subquery di sini hanya a filter , tidak sama dengan join. yaitu Anda menggunakannya untuk membatasi data, bukan untuk menentukan kolom apa yang akan kembali.

Jim L.
sumber
Terkadang, Anda dapat bergabung dengan hasil kueri dan itu akan menyelesaikan masalah!
JosephDoggie
5

Terlepas dari respons yang sangat baik di sini, Anda dapat mencoba ini juga jika Anda ingin menggunakan sub-kueri apa adanya.

Pendekatan:

1) Pilih kolom yang diinginkan (Hanya 1) dari sub kueri Anda

2) Gunakan tempat untuk memetakan nama kolom

Kode:

 SELECT count(distinct dNum)
 FROM myDB.dbo.AQ
 WHERE A_ID in 
   (
    SELECT A_ID 
    FROM (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
         ) a 
   )
SVK
sumber