it-swarm.com.de

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

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 es ein Problem mit der Hauptabfrage gibt.

152
rockit

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 A_ID Verglichen werden? Ihre Unterabfrage darf nur die eine Spalte zurückgeben, die für den Vergleich mit der Spalte auf der anderen Seite von IN erforderlich ist. Die Abfrage muss also die 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. Sie müssen jedoch nicht COUNT als Spalte zurückgeben, um die Sortierung durchzuführen. Die Sortierung in der ORDER -Klausel 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)
208
Chris Latta

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
77
ShoushouLeb

Es beschwert sich über

COUNT(DISTINCT dNum) AS ud 

innerhalb der Unterabfrage. Aus 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 eine Zählung zweimal für dieselbe Spalte durchführen möchten. Oberflächlich betrachtet ist dies für Ihre Arbeit überflüssig. Die Unterabfrage hier ist nur ein Filter es ist nicht dasselbe wie ein Join. Sie verwenden es, um Daten einzuschränken und nicht, um anzugeben, welche Spalten zurückgegeben werden sollen.

10
Jim L

Abgesehen von sehr guten Antworten 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

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 
   )
3
SVK