2010-10-03 8 views
6

zurückgegeben Die Sache ist, dass es eine Zeile zurückgibt.SQL: Fehler: mehr als eine Zeile von einer Unterabfrage als Ausdruck

Hier ist die Sache.

SELECT... 

FROM... 

WHERE... 

GROUP BY... 

HAVING randomNumber > (SELECT value FROM.....) 

Immer wenn ich Zeichen wie = habe,> gibt es mir immer diesen Fehler zurück. Wenn ich es mache, dann nicht.

Sollen Vergleichszeichen beim Vergleich mit einer anderen Tabelle nicht verwendet werden?

+3

IN erwartet 1 oder mehr Werte von subselect zurückgegeben. Vergleichsoperatoren erwarten nur einen einzelnen Rückgabewert. Ihr Problem besteht darin, dass Sie einen Vergleich für mehrere Ergebnisse von subselect verwenden. –

Antwort

6

Wenn Sie Folgendes eingeben:

SomeValue IN (SELECT ...) 

es entspricht der Verwendung:

SomeValue = ANY (SELECT ...) 

nicht die zweite Schreibweise verwenden Sie - aber es zeigt einen Punkt. Wenn SELECT mehr als einen Wert zurückgibt, müssen Sie ANY oder ALL mit dem Vergleicher verwenden. Wenn Sie ANY oder ALL weglassen, müssen Sie einen SELECT-Wert haben, der genau einen Wert zurückgibt.

+0

Warum empfehlen Sie, 'SomeValue = ANY (SELECT ...)' nicht zu verwenden? –

+0

Da die bekannte Schreibweise 'SomeValue IN (SELECT ...)' ist. Menschen (denken sie) wissen, was das bedeutet, ohne nachzuschauen; Sie müssen wahrscheinlich darüber nachdenken, zu demselben Ergebnis zu kommen, wenn Sie '= ANY 'verwenden. Die negierten Versionen sind noch härter: '! = ANY' und'! = ALL' sind ein echter Schmerz, der durchsortiert werden muss. –

0

Sie können mit dem Operator IN mehrere Werte angeben. Wenn Sie >, = , < usw. verwenden versuchen, dies mit:

HAVING randomNUmber > (SELECT MAX(value) FROM ......) 
Verwandte Themen