Като начало, ако дадем пълната грешка, тя трябва да гласи „Всеки израз GROUP BY трябва да съдържа поне една колона, която не е външна препратка. "
За да разберем грешката, трябва да изясним какво се има предвид под „външна препратка“
(Забележка:в този случай това няма нищо общо с вътрешни или външни съединения)
Вътрешният и външен са във връзка с основната заявка и нейните подзаявки. В този случай EXISTS
е подзаявката и е свързана подзаявка, тъй като има външна препратка към #header.header
, който препраща към външната таблица #header
, докато всяка препратка към #detail
ще се считат за вътрешни препратки.
Така че по същество, защото CASE
използва корелирана подзаявка, която препраща към външната заявка, след което това задейства състоянието на грешка, тъй като това съобщение за грешка се появява, когато се опитате да използвате само изрази в клауза GROUP BY, които се интерпретират като външни препратки.
Подзаявкиможе да се използва в GROUP BY, но не и в корелирани подзаявки.
Объркващо е, че същата грешка може да бъде генерирана от по-проста заявка без подзапитване, като например
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'
или дори замяна на константата с @variable
Чисто като кал?
Кев