이 완전 외부 조인이 작동하지 않는 이유는 무엇입니까?


10

원하는 결과를 얻기 위해 이전에 전체 외부 조인을 사용했지만 간단한 조인을 수행 할 수 없기 때문에 개념을 완전히 이해하지 못할 수도 있습니다.

2 개의 필드가있는 2 개의 테이블 (t1 및 t2라고 함)이 있습니다.

t1

Policy_Number Premium
101             15
102              7
103             10
108             25
111              3

t2

Policy_Number   Loss
101              5
103              9
107              20

내가하려고하는 것은 두 테이블과 Policy_Number에서 Premium과 Loss의 합계를 얻는 것입니다. 내가 사용하는 코드는 다음과 같습니다

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by t1.policynumber

위의 코드는 정확한 총계를 반환하지만 "NULL"policy_number에서 policy_number가 일치하지 않는 모든 레코드를 그룹화합니다.

내 결과는 다음과 같습니다

Policy_Number    Prem_Sum    Loss_Sum
    107            NULL        20
    111              3        NULL
    101             15          5

기타.....

아래에 표시된 것처럼 NULL policy_number를 표시하는 결과를 원하지 않습니다 (Null policy_number와 같은 것이 없기 때문에 두 테이블의 policy_number가 일치하지 않는 경우의 총계입니다).

Policy_Number    Prem_Sum   Loss_Sum
   NULL            35         NULL

t1.policy_number 대신 t2.policy_number로 선택하고 그룹화하면 아래와 같은 레코드가 나타납니다.

Policy_Number    Prem_Sum   Loss_Sum
   NULL            NULL         20

다시, Prem_Sum 또는 Loss_sum에서 NULL을 보지 않아도 Policy_Number에서 NULL을 원하지 않습니다. 내 결과는 다음과 같습니다

Policy_Number    Prem_Sum    Loss_Sum
    107            NULL        20
    111              3        NULL
    101             15          5

요법 .....

나는 완전한 외부 조인이 이것을 달성 할 것이라고 생각했지만 뭔가 빠진 것 같습니다. 하위 쿼리로 t1.policy_number와 t2.policy_number를 모두 선택하고 그룹화 한 다음 외부 쿼리 또는 CASE에서 CASE를 수행 할 수 있을까요? 나는 이것이 복잡해야한다고 생각하지 않습니다.

어떤 아이디어 나 조언이 있습니까?

답변:


8

올바르게 그룹화 할 수 있도록 두 policynumber에 대해 isull을 수행해야합니다.

외부 조인이므로 조인의 한 쪽이 여전히 데이터를 가지고있는 동안 NULL 일 가능성이 있습니다.

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, isnull(t1.policynumber, t2.policynumber)
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by isnull(t1.policynumber, t2.policynumber)

... 이것은 null이 SQL에 의해 값처럼 취급되므로 ISNULL ()이 필요한 이유입니다. 이것이 SQL이 그렇게 나쁜 이유입니다. 그러나 나는 여전히 매일 그것을 사용합니다.
Paul-Sebastian Manole

4

전체 외부 조인은 필요한 레코드 구조를 생성하지만 정책 번호 107은 표 1에 포함되지 않습니다.

당신이 필요로하는 것은

select coalesce(t1.policy_number, t2.policy_number) as PolicyNumber, 
sum(t1.premium) as PremSum, sum(t2.loss) as LossSum
from t1 full outer join t2 on t1.policy_number = t2.policy_number
group by coalesce(t1.policy_number, t2.policy_number)

2

특정 검색어가 작동하지 않은 이유에 대한 정보를 조금 더 제공합니다. 시작 코드는 다음과 같습니다.

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber 
from t1 full outer join t2 on t1.policynumber = t2.policynumber 
group by t1.policynumber 

언뜻보기에 이것이 작동하는 것처럼 보입니다. 그러나 지정된 세 번째 열은 t1.policynumber입니다. 이것은 또한 유일한 그룹화 열입니다. 이 SQL Server 때문에 t1의 값만보고 t1에없는 값은 null로 남겨 둡니다 (이는 전체 외부 조인이므로 기억하십시오). isnull (t1.policynumber, t2.policynumber) 코드는 t1의 모든 널이 아닌 값을 제공 한 다음 t2의 값을 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.