In der Auswahlliste kann nur ein Ausdruck angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeführt wird

176

Meine Abfrage lautet wie folgt und enthält eine Unterabfrage:

 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)

Der Fehler, den ich erhalte, ist ...

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

Wenn ich die Unterabfrage alleine ausführe, wird sie einwandfrei zurückgegeben. Ich gehe also davon aus, dass ein Problem mit der Hauptabfrage vorliegt.

Rock Es
quelle

Antworten:

229

Sie können nicht zwei (oder mehrere) Spalten in Ihrer Unterabfrage zurückgeben, um den Vergleich in der WHERE A_ID IN (subquery)Klausel durchzuführen - mit welcher Spalte soll sie verglichen werden A_ID? Ihre Unterabfrage darf nur die eine Spalte zurückgeben, die für den Vergleich mit der Spalte auf der anderen Seite der Spalte benötigt wird IN. Die Abfrage muss also die folgende Form haben:

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

Sie möchten auch eine Sortierung hinzufügen, damit Sie nur aus den oberen Zeilen auswählen können, aber Sie müssen COUNT nicht als Spalte zurückgeben, um Ihre Sortierung durchzuführen. Das Sortieren in der ORDERKlausel ist unabhängig von den von der Abfrage zurückgegebenen Spalten.

Versuchen Sie so etwas:

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
quelle
83

Sie sollten nur eine Spalte und eine Zeile in der where-Abfrage zurückgeben, in der Sie den zurückgegebenen Wert einer Variablen zuweisen. Beispiel:

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
quelle
2
Es hat mir nicht geholfen. Gibt mir den gleichen Fehler. Das Angeben der Spalte anstelle von *hat mir geholfen.
Mohammedsalim Shivani
11

Es beschwert sich über

COUNT(DISTINCT dNum) AS ud 

innerhalb der Unterabfrage. Von der Unterabfrage kann nur eine Spalte zurückgegeben werden, es sei denn, Sie führen eine vorhandene Abfrage durch. Ich bin mir nicht sicher, warum Sie zweimal für dieselbe Spalte zählen möchten. Oberflächlich betrachtet sieht es für das, was Sie tun, überflüssig aus. Die Unterabfrage hier ist nur ein Filter , der nicht mit einem Join identisch ist. dh Sie verwenden es, um Daten einzuschränken und nicht um anzugeben, welche Spalten zurückgegeben werden sollen.

Jim L.
quelle
Manchmal können Sie sich gegen Abfrageergebnisse anmelden, und das löst das Problem!
JosephDoggie
5

Abgesehen von sehr guten Antworten hier können Sie dies auch versuchen, wenn Sie Ihre Unterabfrage unverändert verwenden möchten.

Ansatz:

1) Wählen Sie die gewünschte Spalte (nur 1) aus Ihrer Unterabfrage aus

2) Verwenden Sie, wo der Spaltenname zugeordnet werden soll

Code:

 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
quelle