2013-06-13 3 views
0

저는 여기에 구현할 유니온의 특수한 종류가 있습니다. R1 유니언 R2를 가정합니다. 두 테이블 R은 두 부분으로 나눌 수 있습니다. RA 부분은 유니언이 될 내용이고 RP 부분은 그냥 번호.외부 조인 또는 특수 조합

내 특수 조합은 R1.A에 일반 연합 R2.A를 추가하고 A가 두 개 모두에 존재할 경우 1- (1-R1.P) (1-R2.P) 인 새로운 수 P를 계산합니다. R1, R2. 또는 A가 R1에 없으면 A가 R2 또는 R2.P에 없으면이 번호는 R1.P입니다. 어떤 접근 방식을 환영합니다, 많은 감사

당신이 중 하나 full outer join 또는 사용하여이 작업을 수행 할 수

답변

3

, enter image description here

내가 MS SQL 서버 2012을 사용하고 있습니다 :

힘이 복잡하게 들리 겠지만이 그림 좀 봐 union all. 개인적으로, 나는 full outer join 선호 :의 조인에 찬성

select coalesce(r1.a, r2.a), 
     (case when r1.p is null then r2.p 
      when r2.p is null then r1.p 
      else 1 - (1-r1.p)*(1-r2.p) 
     end) as p 
from r1 full outer join 
    r2 
    on r1.a = r2.a; 

내 바이어스 나는 그들이 최적화를 위해 인덱스를 사용하는 것이 잘 최적화 할 가능성이 생각뿐입니다. union all/group by 버전은 잘 작동하는 것이 가능하다 : 나는 조인을 선호하는 이유

select a, 
     (case when count(*) = 1 then coalesce(min(r1p), min(r2p)) 
      else 1 - (1 - min(r1p))*(1 - min(r2p)) 
     end) as p 
from (select r1.a, r1.p as r1p, null as r2p 
     union all 
     select r2.a, null, r2.p 
    ) t 
group by a 

는 사실, 지금은 쿼리를 작성하는 것이, 나도 알아. 산술 연산은 집계가 없을 때 표현하는 것이 더 간단합니다.

+1

+1 : 문제 성명을 잘 반영하기 때문에 '전체 참여'를 좋아합니다. 그러나'null'을 포함한 모든 표현식 (무효에 대한 명시 적 테스트 제외)은''coalesce()'식으로 대체 될 수 있으므로 두 번째 결과 열 ('case' 표현 연산'p') 널'이다. 이것은 좀 더 간단합니다.'coalesce (1- (1-r1.p) * (1-r2.p), r1.p, r2.p)를'p'로 만듭니다. –

+0

나는 완전한 외부 조인을 위해 투표 할 것이고, 그것은 내 눈을 이기고, 포맷하는 것이 더 좋아 보인다. –