サブクエリを使用してグループ化するときのSQL Server 2005エラー
-
06-07-2019 - |
質問
SQL Server 2005を使用して、サブクエリを含むcaseステートメントに基づいてグループ化しようとしていますが、エラーが発生しています("各GROUP BY式には少なくとも1つの列参照が含まれている必要があります。 ")。簡単に回避できますが、エラーを説明できる人はいますか? #header.headerへの列参照があります。
create table #header (header int)
create table #detail (header int, detail int)
insert into #header values (1)
insert into #header values (2)
insert into #header values (3)
insert into #detail values (1, 1)
insert into #detail values (2, 1)
--error: Each GROUP BY expression must contain at least one column reference.
select case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
group by case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end
--results I want
select hasrecords, count(*) from
(
select case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
) hasrecords
group by hasrecords
drop table #header
drop table #detail
[編集]注釈付き(コメントに対する)相関サブクエリと非相関サブクエリ:
--correlated
select header, case when exists (select 1 from #detail where #detail.header = #header.header) then 1 else 0 end hasrecords from #header
--non-correlated
select #header.header, case when count(#detail.header) > 0 then 1 else 0 end hasrecords from #header left join #detail on #header.header = #detail.header group by #header.header
解決
開始するには、完全なエラーを指定する場合、「各GROUP BY式には、外部参照ではない列が少なくとも1つ含まれている必要があります。"
エラーを理解するには、「外部参照」
の意味を明確にする必要があります(注:この場合、内部結合または外部結合とは関係ありません)
内部および外部は、メインクエリとそのサブクエリを参照しています。
この場合、 EXISTS
はサブクエリであり、#header.header <の外部参照があるため、 相関 サブクエリです。 / code>は、外部テーブル
#header
を参照していますが、 #detail
への参照は内部参照と見なされます。
本質的に、 CASE
は外部クエリを参照する相関サブクエリを使用するため、GROUP BYで式のみを使用しようとするとこのエラーメッセージが表示されるため、エラー状態が発生します外部参照として解釈される句。
サブクエリ はGROUP BYで使用できますが、相関サブクエリは使用できません。
紛らわしいことに、同じエラーは、サブクエリのない、より単純なクエリなどによって生成される可能性があります
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'
または定数を @variable
泥としてクリアしますか
Kev
他のヒント
値ではなく(ヘッダー)でグループ化する実際の列を指定する必要がある場合、1または0でグループ化するように指示しています。
だから、私が正しく理解しているなら、ヘッダーのリストとその詳細レコードのカウントが必要ですか?
これはあなたのために働くかもしれませんか?
SELECT DISTINCT h.header, COUNT(d.detail) AS detail_count
FROM #header AS h
LEFT JOIN #detail AS d ON d.header = h.header
GROUP BY h.header, d.detail
次のような結果で...
header detail_count
1 1
2 1
3 0