Untuk memulai, jika kita memberikan kesalahan penuh, seharusnya terbaca "Setiap ekspresi GROUP BY harus berisi setidaknya satu kolom yang bukan referensi luar. "
Untuk memahami kesalahan, kita perlu mengklarifikasi apa yang dimaksud dengan 'referensi luar'
(Catatan:dalam hal ini tidak ada hubungannya dengan gabungan dalam atau luar)
bagian dalam dan luar mengacu pada kueri utama dan subkuerinya. Dalam hal ini EXISTS
adalah subquery dan merupakan berkorelasi subquery karena memiliki referensi luar #header.header
, yang merujuk ke tabel luar #header
, sedangkan referensi apa pun ke #detail
akan dianggap sebagai referensi batin.
Jadi intinya, karena CASE
menggunakan subkueri berkorelasi yang mereferensikan kueri luar, lalu mengaktifkan status kesalahan, karena pesan kesalahan ini muncul saat Anda mencoba hanya menggunakan ekspresi dalam klausa GROUP BY yang ditafsirkan sebagai referensi luar.
Subkueri bisa digunakan di GROUP BY, tetapi bukan subkueri yang berkorelasi.
Yang membingungkan, kesalahan yang sama dapat dihasilkan oleh kueri yang tidak disubkueri dan lebih sederhana seperti
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'
atau bahkan mengganti konstanta dengan @variable
Bening seperti lumpur?
Kev