Till att börja med, om vi ger det fullständiga felet, bör det stå "Varje GROUP BY-uttryck måste innehålla minst en kolumn som inte är en yttre referens. "
För att förstå felet måste vi klargöra vad som menas med en 'yttre referens'
(Obs:i det här fallet har det ingenting att göra med inre eller yttre sammanfogningar)
Det inre och yttre refererar till huvudfrågan och dess underfrågor. I det här fallet EXISTS
är underfrågan och den är en korrelerad underfrågan eftersom den har en yttre referens till #header.header
, som refererar till den yttre tabellen #header
, medan alla hänvisningar till #detail
skulle betraktas som inre referenser.
Så i huvudsak eftersom CASE
använder en korrelerad underfråga som refererar till den yttre frågan, då aktiveras feltillståndet, eftersom detta felmeddelande visas när du försöker använda endast uttryck i en GROUP BY-sats som tolkas som yttre referenser.
Undersökningar kan användas i GROUP BY, men inte korrelerade underfrågor.
Förvirrande nog kan samma fel genereras av en enklare fråga som inte har undersökts, t.ex.
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'
eller till och med ersätta konstanten med en @variable
Klar som lera?
Kev