2013-01-31 6 views
1

안녕을 동일한 열을 가져올 수어떻게 ... 나는 다음과 같은 테이블이 다른 테이블에서

A (ID, 이름) B (ID, 이름) C (ID, 이름) 지금

내가 각 테이블의 이름을 가져 와서 교차 제품 table.ie가 없도록하려는 경우 총 행 수가 최대 행 테이블을 초과하지 않습니다. Exp를 데이터는이 표에

 
nodename_A  nodename_B  nodename_C 
Dilip   Dilip   NULL 
Amit   NULL   Amit 
Piyush   NULL   Piyush 
Sumit   Sumit   NULL 

는 ID와 노드의 모든 항목을 포함 기본 테이블은 아래와 같이 있어야 풋 아웃이어서

 

    for table A 
id  name 
1  dilip 
2  Amit 
3  Piyush 
4  sumit 

for table B 
id  name 
1  dilip 
4  sumit 

for table C 
id  name 
2  Amit 
3  Piyush 

이하이면되지만, 다른 테이블 월 적은 수의 항목을 포함하거나 중복 된 항목을 포함 할 수 있습니다.

조인에 내가 COALESCE로 사용 FULL JOIN 그것을

+0

처럼 보인다 또는 다른 값을 가질 수있는 tableA에는 없습니까? –

+0

감사합니다 Mike Parkhill, A는 ID와 이름의 모든 항목을 포함하는 기본 표입니다. 그러나 다른 표에는 반드시 모든 항목이 포함되어 있지 않거나 중복 항목이 포함될 수도 있습니다. –

답변

0

을 할 수있는 방법을 가르쳐주세요 :

select nodename_A = A.name 
    , nodename_B = B.name 
    , nodename_C = C.name 
from A 
    full join B on A.id = B.id 
    full join C on coalesce(A.id, B.id) = C.id 
order by coalesce (A.id, B.id, C.id) 

은 현재 실행중인 코드의 예를 볼 수 있습니다

SQL Fiddle with demo합니다.

  1. 표 A는 모든 이름 레코드가됩니다 새로운 코멘트 지금 있으리라 믿고있어 기반으로 OK

    .

  2. 다른 테이블에 중복이있을 수 있습니다.

이 새로운 쿼리는 위의 시나리오에 대해 작동합니다

select nodename_A = A.name 
    , nodenameB = case when exists (select 1 from B where A.id = B.id) then A.name end 
    , nodenameC = case when exists (select 1 from C where A.id = C.id) then A.name end 
from A 

New SQL Fiddle demo을, 이제 데이터 중복으로.

잘하면이 작품은 지금 당신을 위해.

+0

그러나 내가 가져온 행 수가 많으면 행 수가 많습니다 가장 큰 테이블에 –

+0

위의 데모를 실행 해 보셨습니까? 예상대로 네 개의 행을 반환합니다. 더 많은 정보를 제공해 주시겠습니까? –

+0

질문이 업데이트되었습니다. –

0

나는 외부의 몇을해야 조인 생각 : 어떤 피벗 트릭에 대한

Select a.name as aName, b.name as bName, c.name as cName 
From A 
LEFT join B on a.id = b.id 
LEFT join C on a.id = c.id 
+0

Thanks @ Mike Parkhill,하지만 이름이 아닌 이름을 기반으로 가져와야합니다. –

+0

@Ian Preston의 Sql Fiddle을 사용하여 위의 쿼리를 통해 원하는 출력을 얻을 수있었습니다. –

0

? 단지 sollution 차이가

..

내가 완전 외부 추측이 솔루션은 어쨌든

를 읽고 더 쉽게 가입 ..

당신은 정말 나던

는이

select * 
from( select name as row 
         ,'Table A' as [table] 
         ,name 
       from [table A] 

       union all    
       select name as row 
        ,'Table B' as [table] 
        ,name 
       from [Table B]  

       union all 
       select name as row 
        ,'Table C' as [table] 
        ,name 
       from [Table C]  
)V 
PIVOT(max(v.name) for [table] in ([Table A],[Table B],[Table C]))P 
order by row 

결과 집합 같은 것을 수행해야 존재하는 경우 같은 각 행의 모든 ​​컬럼의 이름, 또는 null을하려면이

Table A  Table B  Table C 
Dilip   Dilip   NULL 
Amit   NULL   Amit 
Piyush   NULL   Piyush 
Sumit   Sumit   NULL 
것 같아

각 테이블의 이름 목록 만 원할 경우

같은 이름 의이 같은 행에있을 필요가없는 ..이

select * 
from( select ROW_NUMBER() over (order by name) as row 
         ,'Table A' as [table] 
         ,name 
       from [table A] 

       union all    
       select ROW_NUMBER() over (order by name) as row 
        ,'Table B' as [table] 
        ,name 
       from [Table B]  

       union all 
       select ROW_NUMBER() over (order by name) as row 
        ,'Table C' as [table] 
        ,name 
       from [Table C]  
)V 
PIVOT(max(v.name) for [table] in ([Table A],[Table B],[Table C]))P 
order by row 

결과 집합 같은 것을해야하는 것은 TABLEA 가능한 모든 이름의 상위로 보장이

Table A  Table B  Table C 
Amit   Dilip   Amit 
Dilip   Sumit   Piyush 
Piyush   NULL   NULL 
Sumit   NULL   NULL 
관련 문제