2012-05-16 9 views
1

UNION 또는 다른 기술을 사용하여 하나의 결과로 표시하고자하는 두 개의 테이블이 있습니다.하나에서 다른 값을 상속하는 두 개의 테이블을 병합

ID 필드는 두 테이블을 모두 관련시킵니다.

두 번째 테이블에는 한 개의 필드가 누락되어 있으므로 첫 번째 테이블에서 누락 된 값을 가져야합니다.

아래의 샘플 코드는 작동하지만 큰 데이터 세트의 경우 매우 느립니다.

더 효율적인 솔루션이 있습니까?

T1:      T2: 
+----+-------+--------+ +----+------+ 
| id | name | town | | id | name | 
+----+-------+--------+ +----+------+ 
| 1 | Alice | London | | 1 | Bob | 
| 2 | Alan | Zurich | +----+------+ 
+----+-------+--------+ 

원하는 결과 :

+----+-------+--------+ 
| id | name | town | 
+----+-------+--------+ 
| 1 | Alice | London | 
| 2 | Alan | Zurich | 
| 1 | Bob | London | 
+----+-------+--------+ 

샘플 코드 : 그냥이 같은

with T1 as 
(
    select * from 
    (
     values 
      (1,'Alice','London') , 
      (2,'Alan','Zurich') 
    ) as t (id,name,town) 
), T2 as 
(
    select * from 
    (
     values 
      (1,'Bob') 
    ) as t (id,name) 
), T2WithTown as 
(
    select t2.id,t2.name,t1.town from T2 
    inner join T1 on t2.id=t1.id 
) 

select id,name,town from T1 
union 
select id,name,town from T2WithTown 
+0

당신은 가장 쿼리를 adresses 대한 답변을 또한 upvote에 어떻게해야 선호합니다. 이것은 같은 문제를 검색하는 사용자에게 도움이 될 것입니다. – Nilish

답변

0

샘플 데이터는 두 테이블이 고유 한 값을 보여줍니다. 그래서 UNION ALL

Select ID, Name, Town From T1 
UNION ALL 
select T2.ID, T2.Name, T1.Town 
from T1 
INNER JOIN T2 on T2.id = T1.id 
0

는 :

with T1 as 
(
    select * from 
    (
     values 
      (1,'Alice','London') , 
      (2,'Alan','Zurich') 
    ) as t (id,name,town) 
), T2 as 
(
    select * from 
    (
     values 
      (1,'Bob') 
    ) as t (id,name) 
), T2WithTown as 
(
    select t2.id,t2.name,t1.town from T2 
    inner join T1 on t2.id=t1.id 
) 

select id,name,town from T1 
union 
select T2.id, T2.name, T1.town 
from T1 
inner join T2 on T2.id = T1.id 
0
select id,name, town from t1 
union 
select id,name, (select top 1 town from t1 where t1.id=t2.id) from t2 
+0

이 댓글에 신경 쓰지 마십시오. 하지만 그것은 Sub Query를 사용하여 명시 적 루프가되는 것 같습니다. – Nilish

+0

예를 들어 조인보다 최악이라고 말하는가? 나는 대부분의 경우에 그럴지도 모른다는 것에 동의하지만, 내 경험상 t2.id에 몇 개의 동일한 값이 포함되어 있다면이 접근법은 합류보다 낫다 – Diego

+0

당신은 충돌에 직면하게 될 것이다 ** 부질의가 하나 이상의 값을 반환했다. =,! =, <, <= , >,> = 또는 하위 쿼리가 식으로 사용될 때 ** 서브 쿼리가 다음과 같은 경우에는 허용되지 않습니다. ** t2.id에 여러 개의 동일한 값이 포함되어있는 경우 – Nilish

관련 문제