2013-06-21 2 views
1

하나 개의 컬럼에 여러 열 결과를 결합하는 :어떻게 다음이 개 테이블과 SQL Server 데이터베이스를

enter image description here

내 질문은 최종 결과는 다음과 같이 할 곳으로 하나의 마스터 ID 목록에 '표 2'의 (3) ID 열을 가져올 것입니다 무슨 쿼리입니다 :

012 3,516,
ID Table1ID 
test1 1 
test1 4 
test2 1 
test2 2 
test3 1 
test3 2 
test3 3 

참고 : 위의 그림과 같이 여기보기는 다음과 같습니다

SELECT   
    dbo.Table1.Description, Table2_1.ID AS Table2ID_1, Table2_2.ID AS Table2ID_2, 
    dbo.Table2.ID AS Table2ID_3 
FROM    
    dbo.Table1 
LEFT OUTER JOIN 
    dbo.Table2 ON dbo.Table1.ID = dbo.Table2.Table1ID3 
LEFT OUTER JOIN 
    dbo.Table2 AS Table2_2 ON dbo.Table1.ID = Table2_2.Table1ID2 
LEFT OUTER JOIN 
    dbo.Table2 AS Table2_1 ON dbo.Table1.ID = Table2_1.Table1ID1 

답변

1

Microsoft SQL Server 2005를 참조 높은 CROSS 불필요한 적용 만들기는 UNPIVOT 문을 지원합니다.

SELECT Description AS [ID], Table1ID 
FROM   (SELECT  Table1.Description, Table2_1.ID AS Table2ID_1, Table2_2.ID AS Table2ID_2, Table2.ID AS Table2ID_3 
       FROM   Table1 LEFT OUTER JOIN 
            Table2 ON Table1.ID = Table2.Table1ID3 LEFT OUTER JOIN 
            Table2 AS Table2_2 ON Table1.ID = Table2_2.Table1ID2 LEFT OUTER JOIN 
            Table2 AS Table2_1 ON Table1.ID = Table2_1.Table1ID1) AS pvttbl 
    UNPIVOT (Table1ID FOR ID IN (Table2ID_1, Table2ID_2, Table2ID_3)) AS unpvttbl 
ORDER BY Description, Table1ID 

MSDN의 Using PIVOT and UNPIVOT을 참조하십시오.

+0

CROSS APPLY는 UNPIVOT과 동일한 기능을 수행합니다. – Taryn

+0

시간을내어 주셔서 감사합니다 ... UNPIVOT을 적용하는 것이 훨씬 깔끔하다는 점을 감안할 때 @JamieSee를 답으로 선택했습니다. 답변으로 하나만 선택하거나 둘 다 선택할 수있는 것 같습니다. 다시 한 번 감사드립니다! – blub

+0

@blub이 답변을 통해 결과를 얻을 수 있지만, 최종 결과를 얻으려면 여러 번 테이블에 가입 할 필요가 없습니다. 이 버전에 대한 실행 계획과 제가 제공 한 버전을 살펴 보았습니까? 정말로 UNPIVOT을 사용하고 싶다면 4 개의 조인이 필요없는 버전을 포함했습니다. – Taryn

4

나의 제안은 그래서 당신은 쉽게 데이터에 가입 할 수 있습니다 Table2의 데이터를 피벗 해제하는 것입니다, 당신은 표 1의 설명을 반환 할 수 있으며, table2 id. CROSS를 사용하여이 쿼리의 UNPIVOT 부분이 적용

select col, value, t2.Id 
from table2 t2 
cross apply 
(
    select 'table1id1', table1id1 union all 
    select 'table1id2', table1id2 union all 
    select 'table1id3', table1id3 
) c (col, value); 

SQL Fiddle with Demo를 참조하십시오.

select t1.description, 
    d.id 
from table1 t1 
inner join 
(
    select col, value, t2.Id 
    from table2 t2 
    cross apply 
    (
    select 'table1id1', table1id1 union all 
    select 'table1id2', table1id2 union all 
    select 'table1id3', table1id3 
    ) c (col, value) 
) d 
    on t1.id = d.value 
order by t1.description, d.id; 

정말 SQL Fiddle with Demo

당신이 있는지 확인하십시오 id 쉽게 반환 할 value 열을 가입 할 수 있습니다, 당신은 행의 데이터가 이제

|  COL | VALUE | ID | 
--------------------------- 
| table1id1 |  1 | 1 | 
| table1id2 |  2 | 1 | 
| table1id3 |  3 | 1 | 
| table1id1 |  2 | 2 | 
| table1id2 |  3 | 2 | 
| table1id3 | (null) | 2 | 
| table1id1 |  3 | 3 | 

:이 결과를 제공 UNPIVOT을 사용하려면 결과를 얻기 위해 각 테이블에 여러 번 참가하지 않는 다음을 사용할 수 있습니다.

select t1.description, t2.id 
from table1 t1 
inner join 
(
    select id, col, value 
    from 
    (
    select id, [Table1ID1], [Table1ID2], [Table1ID3] 
    from table2 
) d 
    unpivot 
    (
    value for col in ([Table1ID1], [Table1ID2], [Table1ID3]) 
) unpiv 
) t2 
    on t1.id = t2.value 
order by t1.description, t2.id; 

SQL Fiddle with Demo을 참조하십시오. UNPIVOT과 CROSS이 적용

는 UNION 모든 쿼리를 같은 일을하고있다 :

select t1.description, t2.id 
from table1 t1 
inner join 
(
    select id, 'table1id1' col, table1id1 value 
    from table2 
    union all 
    select id, 'table1id2' col, table1id2 
    from table2 
    union all 
    select id, 'table1id3' col, table1id3 
    from table2 
) t2 
    on t1.id = t2.value 
order by t1.description, t2.id; 

SQL Fiddle with Demo

관련 문제