Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Errore di SQL Server 2005 durante il raggruppamento tramite sottoquery

Per iniziare, se diamo l'errore completo, dovrebbe leggere "Ogni espressione GROUP BY deve contenere almeno una colonna che non sia un riferimento esterno. "

Per comprendere l'errore, dobbiamo chiarire cosa si intende per 'riferimento esterno'

(Nota:in questo caso non ha nulla a che fare con join interni o esterni)

L'interno e esterno sono in riferimento alla query principale e alle sue sottoquery. In questo caso EXISTS è la sottoquery ed è una correlata subquery in quanto ha un riferimento esterno di #header.header , che fa riferimento alla tabella esterna #header , mentre qualsiasi riferimento a #detail sarebbero considerati riferimenti interni.

Quindi, in sostanza, perché il CASE utilizza una sottoquery correlata che fa riferimento alla query esterna, quindi viene attivato lo stato di errore, poiché questo messaggio di errore viene visualizzato quando si tenta di utilizzare solo espressioni in una clausola GROUP BY interpretate come riferimenti esterni.

Le sottoquery possono essere utilizzato in GROUP BY, ma non nelle sottoquery correlate.

In modo confuso, lo stesso errore può essere generato da una query più semplice non sottoposta a subquery come

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'

o anche sostituendo la costante con una @variable

Chiaro come fango?

Kev