2017-12-17 5 views
0

하나의 마스터와 다른 조회가 2 개 있습니다. 둘 다 키가 없습니다. 표의 구조는 다음과 같습니다. 진정한 고유의 레코드를 식별 믹스에 관여하는 다른 분야가 있기 때문에 키없이 테이블 조인하면 잘못된 결과가 발생합니다.

 first name last name role  location Compensation Level state 
     john  smith  Manager  LA   A     CA 
     john  smith  Manager  BOS  B     MA 
     super  smither developer LA   B     CA 
     tina  taylor  supervisor SFO  A     CA 
     tina  taylor  supervisor BOS  B     MA 


    first name last name role  dept   
    john   smith  manager  finance  
    john   smith  manager  hr  
    super  smither developer PA  
    tina   taylor supervisor HR  
    tina   taylor supervisor hr  

매우 당연하게도, 제 이름에 대한 부서를 얻기 위해 두 테이블을 조인, 성 및 역할의 조합은 잘못된 결과가 발생합니다.

그러나이 같은 구조가 주어진다면 두 테이블을 결합하여 부서를 얻을 수있는 방법이 있습니까?

인라인 부속 조회를 사용하는 것은 최종 절차의 설계 방식 및 기타 요인으로 인해 옵션이 아닙니다.

이 문제에 대한 의견이 있으십니까?

예상 출력 :

first name last name role  location Compensation state dept 
john  smith  Manager LA   A   CA finance 
john  smith  Manager BOS   B   MA hr 
super  smither developer LA   B   CA PA 
tina  taylor  supervisor SFO   A   CA HR 
tina  taylor  supervisor BOS  B   MA HR 
+0

키없이 정확히 어떻게 할 계획입니까? 존 스미스가있는 곳을 알 수있는 방법이 없습니다. 티나 테일러와 같아. – Powerlord

+0

간단히 아니오. 열쇠 자체의 문제는 아니지만 역할/부서를 고유하게 식별 할 수있는 방법은 없습니다. 표 2는 표 1에있는 판별자를 필요로합니다. –

+0

예상 결과의 첫 번째 행에서 첫 번째 부서가 재무 대신 시간이 아니어야한다는 것을 어떻게 알 수 있습니까? 테이블은 정의에 따라 정렬되지 않은 행 집합입니다. –

답변

1

여기에 결정적 결과를 얻을 수 있습니다 예를 들어,하지만 그들은 임의의 결과입니다. 단순히 각 테이블의 "정렬 된 위치"를 결정하므로 선택이 가능하며 쿼리가 실행될 때마다 선택이 동일하지만 선택이 올바른지 알 수있는 방법이 없습니다.

WITH 
    sorted_t1 AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY first_name, last_name, role 
           ORDER BY compensation_level, location, state) AS discriminator 
    FROM 
     t1 
) 
, 
    sorted_t2 AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY first_name, last_name, role 
           ORDER BY dept) AS discriminator 
    FROM 
     t2 
) 
SELECT 
    * 
FROM 
    sorted_t1 t1 
FULL OUTER JOIN 
    sorted_t2 t2 
     ON t1.first_name = t2.first_name 
     AND t1.last_name  = t2.last_name 
     AND t1.role   = t2.role 
     AND t1.discriminator = t2.discriminator 

참고 :

이것은 "대소 문자 구분"데이터 정렬 순서를 가정합니다. 그렇지 않으면 john smith 행은 테이블 2의 두 tina taylor('HR''hr') 다른 유사

,하지만, 정렬 순서는 대소 문자를 구분하는 경우 ('manager' 일치하지 않을 'Manager'로) 에 참여하지 않습니다 행들 사이에 "물질적 인"차이가 없기 때문에 어느 것이 어느쪽에 합류하는지는 중요하지 않습니다.

위의 예에서 LA의 'John Smith'finance이라고 가정 할 실제 이유는 없습니다. 쿼리는 단순히 연결을 강제로 수행하기 때문에 ROW_NUMBER()에서 ORDER BY이 선택 되었기 때문에 연결이 강제로 수행됩니다. 이것은이 기술을 사용할 때 실제로 다른 필드를 사용해야한다는 것을 의미합니다. 즉, 평균이 서로 관련되어 있습니다.

관련 문제