Pro začátek, pokud uvedeme úplnou chybu, mělo by to znít „Každý výraz GROUP BY musí obsahovat alespoň jeden sloupec, který není vnějším odkazem. "
."Abychom porozuměli chybě, musíme si ujasnit, co znamená 'vnější odkaz'
(Poznámka:v tomto případě to nemá nic společného s vnitřním nebo vnějším spojením)
Vnitřní a vnější odkazují na hlavní dotaz a jeho poddotazy. V tomto případě EXISTS
je poddotaz a je to korelovaný poddotaz, protože má vnější odkaz #header.header
, která odkazuje na vnější tabulku #header
, zatímco jakýkoli odkaz na #detail
by byly považovány za vnitřní odkazy.
Takže v podstatě, protože CASE
využívá korelovaný poddotaz, který odkazuje na vnější dotaz, pak to spustí chybový stav, protože tato chybová zpráva se objeví, když se pokusíte použít pouze výrazy v klauzuli GROUP BY, které jsou interpretovány jako vnější odkazy.
Dílčí dotazy mohou být použit v GROUP BY, ale ne v korelovaných poddotazech.
Je matoucí, že stejná chyba může být generována jednodušším dotazem bez dílčího dotazu, jako je
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'
nebo dokonce nahrazením konstanty @variable
Jasné jako bláto?
Kev