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?

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)

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

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.


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 
   )
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.