문제

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top