SQL Server 2005 하위 쿼리를 사용하여 그룹화 할 때 오류
-
06-07-2019 - |
문제
SQL Server 2005를 사용하면 하위 쿼리가있는 Case 문을 기반으로 그룹화하려고하지만 오류가 발생합니다 ( "표현별로 각 그룹에는 하나 이상의 열 참조가 포함되어 있어야합니다."). 아주 쉽게 작업 할 수 있지만 누구든지 오류를 설명 할 수 있습니까? #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
편집] 참고 (의견에 대한 응답으로) 상관 관계 및 비 상관 서브 Queries :
--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
해결책
시작하려면 전체 오류가 발생하면 읽어야합니다.표현별로 각 그룹에는 외부 참조가 아닌 하나 이상의 열이 포함되어야합니다."
오류를 이해하려면 '외부 참조'
(참고 :이 경우 내부 또는 외부 조인과 관련이 없습니다)
그만큼 안의 그리고 밖의 기본 쿼리와 관련하여 하위 쿼리입니다. 이 경우 EXISTS
하위 쿼리이고 그것은 a입니다 상관 관계 외부 참조가있는 서브 쿼리 #header.header
, 외부 테이블을 참조하는 것 #header
, 어떤 참조 #detail
내부 참조로 간주됩니다.
그래서 본질적으로 CASE
외부 쿼리를 참조하는 상관 관계 서브 쿼리를 사용한 다음 오류 상태를 발사합니다.이 오류 메시지는 외부 참조로 해석되는 그룹별 절에서 표현식 만 사용하려고 할 때 나타납니다.
하위 쿼리 ~할 수 있다 그룹에서 사용하지만 상관 관계가있는 하위 쿼리는 사용하지 않습니다.
혼란스럽게도, 동일한 오류는 다음과 같은 비정규적이고 간단한 쿼리로 생성 될 수 있습니다.
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'
또는 상수를 a로 대체합니다 @variable
진흙처럼 깨끗합니까?
케브
다른 팁
값이 아닌 (헤더) 그룹에 실제 열을 제공해야 할 때 그룹을 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