Heim >Datenbank >MySQL-Tutorial >Warum gibt meine SQL-Unterabfrage „In der Auswahlliste kann nur ein Ausdruck angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeleitet wird' zurück?

Warum gibt meine SQL-Unterabfrage „In der Auswahlliste kann nur ein Ausdruck angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeleitet wird' zurück?

Susan Sarandon
Susan SarandonOriginal
2025-01-11 13:26:42633Durchsuche

Why Does My SQL Subquery Return

SQL-Unterabfragefehler: Einzelner Ausdruck in der SELECT-Liste

Diese SQL-Abfrage erzeugt einen Fehler:

<code class="language-sql">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)</code>

Die Fehlermeldung „In der Auswahlliste kann nur ein Ausdruck angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeleitet wird“ weist auf ein Problem mit der SELECT-Klausel der Unterabfrage hin. Die Unterabfrage versucht, zwei Spalten zurückzugeben: A_ID und COUNT(DISTINCT dNum). Bei Verwendung von IN (oder anderen Vergleichsoperatoren wie =, != usw.) darf die SELECT-Liste der Unterabfrage nur eine einzige Spalte enthalten.

Lösung:

Die korrigierte Abfrage sollte nur A_ID aus der Unterabfrage zurückgeben:

<code class="language-sql">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;</code>

Beachten Sie die Änderungen:

  • Die SELECT-Klausel der Unterabfrage enthält jetzt nur noch A_ID.
  • Die ORDER BY-Klausel, die zuvor in der Unterabfrage enthalten war, wurde in die äußere Abfrage verschoben. Dies liegt daran, dass das ursprüngliche ORDER BY versuchte, die Unterabfrageergebnisse zu sortieren, bevor sie in der IN-Klausel verwendet wurden; Die Sortierung sollte für die endgültige Ergebnismenge gelten.

Diese überarbeitete Abfrage wählt korrekt die Anzahl der unterschiedlichen dNum-Werte aus, bei denen A_ID in den Ergebnissen der Unterabfrage gefunden wird. Die Unterabfrage identifiziert effizient die oberen 10 % der A_ID-Werte basierend auf der Anzahl der eindeutigen dNum, und die äußere Abfrage zählt dann die eindeutigen dNum-Werte, die diesen ausgewählten A_IDs zugeordnet sind. Die letzte ORDER BY-Klausel sortiert die Ergebnisse basierend auf der Anzahl der unterschiedlichen dNum-Werte.

Das obige ist der detaillierte Inhalt vonWarum gibt meine SQL-Unterabfrage „In der Auswahlliste kann nur ein Ausdruck angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeleitet wird' zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn