Na początek, jeśli podamy pełny błąd, powinien brzmieć „Każde wyrażenie GROUP BY musi zawierać co najmniej jedną kolumnę, która nie jest zewnętrznym odwołaniem. "
Aby zrozumieć błąd, musimy wyjaśnić, co oznacza „odniesienie zewnętrzne”
(Uwaga:w tym przypadku nie ma to nic wspólnego z połączeniami wewnętrznymi lub zewnętrznymi)
wewnętrzny i zewnętrzne odnoszą się do głównego zapytania i jego podzapytań. W tym przypadku EXISTS
to podzapytanie i jest skorelowane podzapytanie, ponieważ ma zewnętrzne odwołanie do #header.header
, który odwołuje się do zewnętrznej tabeli #header
, natomiast wszelkie odniesienia do #detail
będą traktowane jako wewnętrzne odniesienia.
Tak więc w istocie, ponieważ CASE
wykorzystuje skorelowane podzapytanie, które odwołuje się do zapytania zewnętrznego, a następnie uruchamia stan błędu, ponieważ ten komunikat o błędzie pojawia się, gdy próbujesz użyć tylko wyrażeń w klauzuli GROUP BY, które są interpretowane jako odniesienia zewnętrzne.
Podzapytania mogą być używane w GROUP BY, ale nie w skorelowanych podzapytaniach.
Myląco, ten sam błąd może zostać wygenerowany przez prostsze zapytanie, które nie jest podrzędne, takie jak
select
case when header=1 then 1
else 0
end headeris1,
'constant'
from #header
group by case when header=1 then 1 else 0 end , 'constant'
a nawet zastąpienie stałej @variable
Czysta jak błoto?
Kev