2017-03-20 4 views
0

복잡한 CTE 쿼리가 생성됩니다. 결과 어느 MSSQL
에서 그SQL - 여러 열의 데이터를 하나의 열로 결합

 
| Id1 | Id2 | Id3 | 
| 1 | 2 | 3 | 
| 5 | 4 | 1 | 
| 6 | 5 | 2 | 

같은 것 그리고 지금 나는 조합을 피하려고 모든 선택하려는 그

 
| Ids | 
| 1 | 
| 2 | 
| 3 | 
| 5 | 
| 4 | 
| 1 | 
| 6 | 
| 5 | 
| 2 | 

같은 열 뭔가에 모든 데이터를 결합해야 각 열별로
감사합니다.

+8

'UNION ALL'의 잘못된 점은 무엇입니까? 나는 그걸로 갈 것입니다 ... – jarlh

+0

이 결과는 복잡한 CTE 쿼리에서 나올 것이라고 말했고, 모든 열은 모든 열에 효과적이지 않을 것이라고 생각합니다. –

+2

가장 간단한 방법이 마음에 들거나 맞지 않으면 UNION ALL – scaisEdge

답변

3

이 일을 내가 가장 좋아하는 방법은 cross apply 사용

unpivot를 사용하여 버전처럼
select v.id 
from t cross apply 
    (values (t.id1), (t.id2), (t.id3)) v(id); 

이 한 번만 테이블을 읽고 . union all을 사용하는 버전은 테이블을 세 번 스캔합니다. 그러나 cross applyunpivot보다 훨씬 강력하며 타이핑이 덜 필요합니다.

+0

이것은 ANSI 표준 솔루션이 아닙니다 ... 오히려 제품 특정 – Rahul

+0

@ Rahul 어두운면으로 오십시오 ... – SqlZim

+0

@Rahul. . . 표준에서 측면 조인을 지원합니다. –

1

AFAIK, 사용 방법 이외의 다른 옵션은 없습니다. UNION ope 정액. UNION 작업의 기본 목적은 여러 소스/결과 세트의 레코드를 결합하는 것입니다. 그래서 당신은 당신이 사용할 수

select Id1 from tbl1 
union 
select Id3 from tbl1 
union 
select Id2 from tbl1 
+1

이 답변은 정확하지 않습니다. 왜 그런지 이해하니? –

+0

@GordonLinoff, no .. 깨닫게 – Rahul

+1

@Rahul'union'은 중복 결과를 제거합니다. '노조 모두'는 그렇지 않다. – SqlZim

1

처럼 할 수 UNPIVOT

SELECT Ids 
FROM 
(
    SELECT Id1, Id2, Id3 
    FROM CTE 
) d 
UNPIVOT 
(
    Ids for id in (Id1, Id2, Id3) 
) u 
0
Use UNPIVOT table to get your result : 

CREATE TABLE #table(Id1 INT ,Id2 INT , Id3 INT) 
INSERT INTO #table( Id1 ,Id2 , Id3) 
SELECT 1 , 2 , 3 UNION ALL 
SELECT 5 , 4 , 1 UNION ALL 
SELECT 6 , 5 , 2 

SELECT _Result [Result] 
FROM 
(
    SELECT Id1 ,Id2 , Id3 
    FROM #table 
)A 
UNPIVOT 
(
    _Result FOR Id IN (Id1 , Id2 , Id3) 
) UNPvt 
관련 문제