2013-04-23 2 views
1

내 SQL 요청 중 하나에서 실제로 블로킹 문제가 있습니다. 내 문제는 다음과 같습니다 : 일부 사용자 및 그들의 이름, 주소, 전화 번호를 포함하는 첫 번째 테이블 (임시 테이블) 있습니다 ... 나는 일부에 대한 정보가 들어있는 두 번째 테이블 ("실제"하나) 명령. 명령은 사용자와 관련이 있지만 약간 복잡합니다. 자세한 내용은 여기 선명도, 내 테이블의 정의의 예를 들면 다음과 같습니다SQL Server 2008 - 다른 테이블의 값에 따라 업데이트 수행

USER 
ID   char(8) 
LastName nvarchar(30) 
FirstName nvarchar(30) 
PostCode nvarchar(10) 
PhoneNumber nvarchar(20) 
HomeAdress nvarchar(20) 

COMMAND 
ID   char(6) 
CMD_FirstName nvarchar(20) 
CMD_LastName nvarchar(20) 
CMD_PostCode nvarchar(10) 
ID_User  char(8) 

이 두 테이블이 논리적으로 관련되어 있지만, 실제로는 ... 명령 테이블에서 필드 "ID_User는"일반적으로 없습니다 없습니다. SQL 재검색의 목적은 ID_User 필드를 채워서 모든 명령과 해당 사용자 간의 연결을 만드는 것입니다. ID_User가 null이거나 비어있는 각 명령에 대해 성, 이름, 필드 및 게시물 코드를 일치시켜 사용자를 검색하려고합니다. 이 일치가 엄격하면 (USER 테이블에 doublon이 없다면 중요합니다), ID_User 필드를 채울 수 있습니다.

크고 복잡한 요청을 보내 주시겠습니까? 미리 감사드립니다.

PS : 두 개 이상의 user 일치 FIRSTNAME/LASTNAME/우편 번호 조합을 제외하려면 마이크로 소프트 SQL 서버 2008 R2

답변

4
update c 
set id_user = u.ID 
from [user] u 
join [command] c on c.cmd_firstname = u.firstname 
       and c.cmd_lastname = u.lastname 
       and c.cmd_postcode = u.postcode; 

을 사용하고, 당신은 user 테이블을 집계에게 사전에 그를 필터링 할 수 있습니다.

update c 
set id_user = u.ID 
from [command] c 
join (select firstname, lastname, postcode, min(ID) ID 
     from [user] 
     group by firstname, lastname, postcode 
     having count(*) = 1) u 
    on c.cmd_firstname = u.firstname 
    and c.cmd_lastname = u.lastname 
    and c.cmd_postcode = u.postcode; 
+1

이렇게 생각합니다. 그렇습니다. 하지만이 요청은 일치의 단일성을 확인하지 않습니다 ... 동일한 성, 이름과 포스트 코드를 가진 테이블 USER에 두 명 이상의 사용자가있는 경우 요청은 COMMAND의 ID_User를 업데이트하고, 나는 원하지 않는 ... – DaveLeGO

+0

중복을 처리하기 위해 업데이트 – RichardTheKiwi

+0

나는이 솔루션을 많이 좋아한다. 그러나 JOIN의 SELECT가 ID를 가져 오지 않으므로 SET에서 u.ID를 사용할 수 없기 때문에 두 번째 줄에서 오류가 발생합니다. 이 ID를 SELECT에 넣으면, GROUP BY에 넣어야하는데, 나는 이것을 원하지 않습니다 ... – DaveLeGO

1

당신은, 보장하기 위해 그도 필요 [USER]도 [COMMAND]가 당신이 그들을지도하는 데 사용할 필드에 중복 레코드가 포함되어 있습니다. 여기에는 상관 쿼리가 포함되어 있으며 큰 테이블에는 효율적이지 않을 수 있습니다.

update [command] 
set ID_User = u.id 
from [USER] u 
join COMMAND c 
    on u.LastName=c.CMD_LastName 
    and u.FirstName = c.CMD_FirstName 
    and u.PostCode = c.CMD_PostCode 
where 1=1 
    and not exists (
     select 
      LastName, FirstName, PostCode 
     from [user] 
     where 1=1 
      and LastName=u.LastName 
      and FirstName=u.FirstName 
      and PostCode=u.PostCode 
     group by 
      LastName, FirstName, PostCode 
     having count(*)>1 
    ) 
    and not exists (
     select 
      CMD_LastName, CMD_FirstName, CMD_PostCode 
     from COMMAND 
     where 1=1 
      and CMD_FirstName=c.CMD_FirstName 
      and CMD_LastName=c.CMD_LastName 
      and CMD_PostCode=c.CMD_PostCode 
     group by 
      CMD_LastName, CMD_FirstName, CMD_PostCode 
     having count(*)>1 
    ) 
관련 문제