Pour commencer, si nous donnons l'erreur complète, elle devrait se lire "Chaque expression GROUP BY doit contenir au moins une colonne qui n'est pas une référence externe. "
Pour comprendre l'erreur, nous devons clarifier ce que l'on entend par une 'référence externe'
(Remarque :dans ce cas, cela n'a rien à voir avec les jointures internes ou externes)
L'intérieur et extérieur font référence à la requête principale et à ses sous-requêtes. Dans ce cas, le EXISTS
est la sous-requête et c'est un élément corrélé sous-requête car elle a une référence externe de #header.header
, qui fait référence à la table externe #header
, alors que toute référence à #detail
seraient considérés comme des références internes.
Donc, essentiellement, parce que le CASE
utilise une sous-requête corrélée qui fait référence à la requête externe, cela déclenche l'état d'erreur, car ce message d'erreur apparaît lorsque vous essayez d'utiliser uniquement des expressions dans une clause GROUP BY qui sont interprétées comme des références externes.
Les sous-requêtes peuvent être utilisé dans GROUP BY, mais pas dans les sous-requêtes corrélées.
De manière déroutante, la même erreur peut être générée par une requête plus simple et sans sous-requête telle que
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'
ou même en remplaçant la constante par un @variable
Clair comme de la boue ?
Kev