Для начала, если мы дадим полную ошибку, он должен прочитать " Каждое выражение 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
Ясно, как грязь?
Кев