使用子查询分组时,SQL Server 2005中的错误(SQL Server 2005 error

2019-07-28 21:35发布

使用SQL Server 2005我想基于使用子查询的情况下语句组,但我得到一个错误(“每个GROUP BY表达式必须至少包含一个列引用”)。 我可以工作轮它很容易,但任何人都可以解释这个错误吗? 我有一个列引用#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

Answer 1:

首先,如果我们给予充分的错误,应改为“ 每个GROUP BY表达式必须至少包含一列不是外部引用。”

要理解错误,我们需要澄清由“外部引用”是什么意思

(注:在这种情况下,没有任何与内部或外部连接)

内部外部均涉及主查询和它的子查询。 在这种情况下, EXISTS是子查询,这是一个相关子查询,因为它有一个外参考#header.header ,其被引用的外部表#header ,而对任何参考#detail将被视为内部引用。

因此,在本质,因为CASE利用相关子查询引用外部查询,那么这触发错误状态,怎么一回事,因为当您尝试在GROUP BY子句被解释为外部引用仅使用表达式出现此错误消息。

子查询可以在GROUP BY中使用,但不相关子查询。

令人困惑的是,可以通过非subqueried,更简单的查询诸如生成相同的错误

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

清除泥?

千电子伏



Answer 2:

您通过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


文章来源: SQL Server 2005 error when grouping using subquery