2012-02-10 2 views
1

병합 할 테이블이 각각 3 개 있습니다. 서로 다른 관심 항목이 있습니다. 나는 또한 ID 내의 "내에서"별도의 병합을 수행하고자하는 id 변수가 있습니다. 아이디어는 X, Y 및 Z를 날짜 (ID 내)로 병합하고 해당 날짜가 특정 변수에 대해 존재하지 않으면 누락 된 값을 갖기를 원합니다.일부 날짜가 누락 된 날짜별로 SQL 병합 테이블을 병합합니다.

Table X: 
ID  Date   X 
1  2012-01-01 101 
1  2012-01-02 102 
1  2012-01-03 103 
1  2012-01-04 104 
1  2012-01-05 105 
2  2012-01-01 150 

Table Y: 
ID  Date   Y 
1  2012-01-01 301 
1  2012-01-02 302 
1  2012-01-03 303 
1  2012-01-11 311 
2  2012-01-01 350 

Table Z: 
ID  Date   Z 
1  2012-01-01 401 
1  2012-01-03 403 
1  2012-01-04 404 
1  2012-01-11 411 
1  2012-01-21 421 
2  2012-01-01 450 

Desired Result Table: 
ID  Date   X  Y  Z 
1  2012-01-01 101 301 401 
1  2012-01-02 102 302 . 
1  2012-01-03 103 303 403 
1  2012-01-04 104 .  404 
1  2012-01-05 105 .  . 
1  2012-01-11 .  311 411 
1  2012-01-21 .  .  421 
2  2012-01-01 150 350 450 

모든 아이디어를 어떻게 SQL 문을 작성하는 방법? "전체 조인"및 교차 제품에 대한 설명이 어지럽 혔지 만 ID ID 조합 중 일부 또는 ID가 중복되는 경우가 계속됩니다.

도움을 주시면 감사하겠습니다.

답변

2

조인은 까다로운 작업 일 수 있습니다. 내 일반적인 접근 방식은 먼저 키 집합을 구성한 다음 그 키를 사용하여 내가 원하는 것을 얻는 것입니다.

SELECT source.ID, source.Date, x.X, y.Y, z.Z 
FROM 
(
    SELECT ID, Date 
    FROM TableX 
    UNION 
    SELECT ID, Date 
    FROM TableY 
    UNION 
    SELECT ID, Date 
    FROM TableZ 
) as source 
LEFT JOIN TableX x ON source.ID = x.ID AND source.Date = x.Date 
LEFT JOIN TableY y ON source.ID = y.ID AND source.Date = y.Date 
LEFT JOIN TableZ z ON source.ID = z.ID AND source.Date = z.Date 
ORDER BY source.ID, source.Date 
+0

나는 IO를 적게 사용하는 PIVOT과 관련된 또 다른 접근법을 생각할 수 있습니다. –

+0

실제로 각 테이블을 참조하기 때문에 각 테이블에 대해 하위 집합을 두 번 계산해야하기 때문에이 작업은 테이블 X, Y 및 Z의 하위 집합을 실제로 병합 할 때 문제가되며 해당 하위 집합은 계산하는 데 비용이 많이 듭니다. 두 개의 다른 'from'절에서. 그러나 이것은 아마도 가장 깨끗하고 빠른 접근 방법 일 것입니다. 나는 실제로 테이블 X, Y, Z를 여러 번 생성하는 것을 피하기 위해 다른 대답을 찾고 있기 때문에 비슷한 질문을 던졌습니다. – Triynko

관련 문제