2010-10-03 13 views
6

Chodzi o to, że zwraca jeden wiersz.SQL: BŁĄD: więcej niż jeden wiersz został zwrócony przez podzapytanie użyte jako wyrażenie

O to chodzi.

SELECT... 

FROM... 

WHERE... 

GROUP BY... 

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

Ilekroć mam objawy takie jak =,> zawsze zwraca mi ten błąd. Kiedy robię IN, to nie.

Czy nie powinno się używać znaków porównawczych w porównaniu do innej tabeli?

+3

IN oczekuje, że 1 lub więcej wartości zostanie zwróconych z podselekcji. Operatory porównania oczekują tylko jednej wartości zwracanej. Twoim problemem jest to, że używasz porównania na wielu wynikach z podselekcji. –

Odpowiedz

6

Po wpisaniu:

SomeValue IN (SELECT ...) 

jest równoważne użyciu:

SomeValue = ANY (SELECT ...) 

Nie używaj drugiego zapisu - ale ilustruje punkt. Kiedy SELECT zwraca więcej niż jedną wartość, musisz użyć DOWOLNEGO lub WSZYSTKIEGO z komparatorem. Kiedy pominiesz DOWOLNE lub WSZYSTKIE, musisz mieć SELECT, który zwraca dokładnie jedną wartość.

+0

Dlaczego nie zaleca się używania parametru "SomeValue = Any (SELECT ...)"? –

+0

Ponieważ znana pisownia to 'SomeValue IN (SELECT ...)'. Ludzie (uważają, że) wiedzą, co to oznacza, nie patrząc na to; prawdopodobnie muszą się mocno zastanowić, aby dojść do tego samego wniosku, jeśli użyjesz '= ANY". Negowane wersje są jeszcze trudniejsze: '! = ANY' i'! = ALL' to prawdziwy problem. –

0

Można podać wiele wartości za pomocą operatora IN. Jeśli używasz >, = , < itd. Spróbuj użyć tego:

HAVING randomNUmber > (SELECT MAX(value) FROM ......) 
Powiązane problemy