Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Erreur SQL Server 2005 lors du regroupement à l'aide d'une sous-requête

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