나의 제안은 그래서 당신은 쉽게 데이터에 가입 할 수 있습니다 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
CROSS APPLY는 UNPIVOT과 동일한 기능을 수행합니다. – Taryn
시간을내어 주셔서 감사합니다 ... UNPIVOT을 적용하는 것이 훨씬 깔끔하다는 점을 감안할 때 @JamieSee를 답으로 선택했습니다. 답변으로 하나만 선택하거나 둘 다 선택할 수있는 것 같습니다. 다시 한 번 감사드립니다! – blub
@blub이 답변을 통해 결과를 얻을 수 있지만, 최종 결과를 얻으려면 여러 번 테이블에 가입 할 필요가 없습니다. 이 버전에 대한 실행 계획과 제가 제공 한 버전을 살펴 보았습니까? 정말로 UNPIVOT을 사용하고 싶다면 4 개의 조인이 필요없는 버전을 포함했습니다. – Taryn