2013-05-10 2 views
0

에 대한 3 개 테이블을 조인 나는 3 개 테이블이 : TABLEA (ID의 INT를, 이름 VARCHAR (2))SQL 서버 2012 : 조건

ID Name 
01 A4 
01 SH 
01 9K 
02 M1 
02 L4 
03 2G 
03 99 

TableB의 (이름 VARCHAR (2))

Name 
5G 
U8 
02 
45 
23 
J7 
99 
9F 
A4 
H2.... 

TableC (ID INT, 이름 VARCHAR (2)) (A와 같은 기록의 같은 수) (TABLEA에서 ID로 미리 채워)

내가 B.Name에서 수 있도록 C.Name을 채우려
ID Name 
01 NULL 
01 NULL 
01 NULL 
02 NULL 
02 NULL 
03 NULL 
03 NULL 

사에 대한 나 ID (예 : 1), A.Name과 다른 값을 가져야합니다. 그래서 A.Name에 이미 존재하기 때문에 C.Name은 ID = 1에 대해 (A4, SH, 9K)를 가질 수 없습니다. 또한 A.name은 B.name에 존재할 수도 있고 없을 수도 있습니다.

문제는 여기에 tableB에 추가 열이 없습니다. 테이블을 조인 할 때 더 많은 열이 필요합니까? 도움 주셔서 감사합니다.

+0

**하십시오 : 항상 ** 콘크리트 데이터베이스 시스템 ** 및 버전을 넣어 ** (같은 : 'sql-server-2012') 질문 할 때 태그로 사용하고 있습니다 - 감사합니다! –

+0

물론입니다. 나는 그것을 명심 할 것이다. 감사합니다 :) –

답변

2

update 절의 다소 비효율적 인 중첩 된 쿼리 구조로이 작업을 수행 할 수 있습니다. SQL 서버 구문에서

는 :

update tableC 
    set Name = (select top 1 b.name 
       from TableB b 
       where b.name not in (select name from TableA a where a.id = TableC.id) 
       order by NEWID() 
       ) 

TableA의에서 내부 가장 select는 동일한 ID에서 모든 이름을 가져옵니다. where 절은이 목록에서 이 아닌 인 이름을 선택합니다. order by() limit 1은 이름 중 하나를 임의로 선택합니다. 여기

문제에 대한 이해에 따라 작동하는 코드의 예입니다

declare @tableA table (id int, name varchar(2)); 
declare @tableB table (name varchar(2)); 
declare @tableC table (id int, name varchar(2)) 

insert into @tableA(id, name) 
    select 01, 'A4' union all 
    select 01, 'SH' union all 
    select 01, '9K' union all 
    select 02, 'M1' union all 
    select 02, 'L4' union all 
    select 03, '2G' union all 
    select 03, '99'; 

insert into @tableB(name) 
    select '5G' union all 
    select 'U8' union all 
    select '02' union all 
    select '45' union all 
    select '23' union all 
    select 'J7' union all 
    select '99' union all 
    select '9F' union all 
    select 'A4' union all 
    select 'H2'; 


insert into @tableC(id) 
    select 01 union all 
    select 01 union all 
    select 01 union all 
    select 02 union all 
    select 02 union all 
    select 03 union all 
    select 03; 

/*  
select * from @tableA; 
select * from @tableB; 
select * from @tableC; 
*/ 

update c 
    set Name = (select top 1 b.name 
       from @TableB b 
       where b.name not in (select name from @TableA a where a.id = c.id) 
       order by NEWID() 
       ) 
from @tableC c 

select * 
from @tableC 
+0

고든 고마워. 멀티 파트 식별자 "TableC.id"를 바인딩 할 수 없습니다. –

+0

업데이트 된 쿼리는 각 고객에 대해 하나의 이름을 선택합니다. 나는 모든 업데이트 된 행이 이름을 무작위로 선택해야한다는 것을 분명히해야한다. 예를 들어, C.ID = 1은 C.Names x, y, z를 가져야합니다. 여기서 x y z는 A.names에 존재하지 않지만 B.Name에는 존재합니다. 난 그 혼란을 알고 당신의 모든 도움을 주셔서 감사합니다 :) –

+0

이것은 각 ID에 대한 DISTINCT로 채워지는 각 C.name을 원하는 작은 사양으로 정확합니다. C.Name은 동일한 ID에 대해 동일한 값을 가질 수 없습니다. 그러나 우리는 서로 다른 ID에 대해 동일한 C.name 값을 가질 수 있습니다. –