0

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
4

2 に答える 2

3

まず、完全なエラーを表示すると、「各 GROUP BY 式には、外部参照ではない列が少なくとも 1 つ含まれている必要があります。」と表示されます。

エラーを理解するには、「外部参照」の意味を明確にする必要があります

(注: この場合、内部結合または外部結合とは関係ありません)

内側外側は、メイン クエリとそのサブクエリを参照しています。この場合、EXISTSはサブクエリであり、 の外部参照があり、外部テーブル を参照しているため、相関サブクエリです。一方、 への参照はすべて内部参照と見なされます。#header.header#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

泥のように透明?

ケブ

于 2009-06-17T18:47:22.813 に答える
0

値ではなく、グループ化する実際の列 (ヘッダー) を指定する必要がある場合は、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
于 2009-06-17T14:35:40.963 に答える