2012-06-26 4 views
0

나는이 두 테이블사용하여 표 A에서 표 B에 삽입 고유

표 A

NameID FirstName MiddleName LastName Addr1 Addr2 Phn1 Phn2 City State 
NULL  Micheal Calvin  Dodson 12  23  1234 123 XYZ ABC  
NULL  John  NULL  Keith  NULL NULL 2344 NULL SQE FDG  
NULL  John  NULL  Keith  NULL NULL 2344 NULL SQE FDG 
NULL  William Stephen  NULL  45  NULL NULL NULL HJD ABC 
NULL  Victor  NULL  Anthony NULL NULL NULL NULL NULL NULL 

표 B 내가 (FIRSTNAME, 가운데 이름의 독특한 기록을 얻을 필요가

NameID FirstName MiddleName LastName Addr1 Addr2 Phn1 Phn2 City State Zip Email Gender... 

, LastName)을 입력하고 표 A와 일치하는 다른 필드와 동일한 세부 정보를 표 B에 삽입하십시오. 내 표 B는 ID coloum으로 NameID를가집니다. 그래서 표 B에 독특한 기록을 삽입 한 후, 나는 다음과 같이 그 NameID을 얻고 표 A로 다시 삽입해야합니다

표 A

표 A

NameID FirstName MiddleName LastName Addr1 Addr2 Phn1 Phn2 City State 
1   Micheal Calvin  Dodson 12  23  1234 123 XYZ ABC  
2   John  NULL  Keith  NULL NULL 2344 NULL SQE FDG  
2   John  NULL  Keith  NULL NULL 2344 NULL SQE FDG 
3   William Stephen  NULL  45  NULL NULL NULL HJD ABC 
4   Victor  NULL  Anthony NULL NULL NULL NULL NULL NULL 

표 B

NameID FirstName MiddleName LastName Addr1 Addr2 Phn1 Phn2 City State Zip Email Gender... 
1  Micheal Calvin  Dodson 12  23  1234 123 XYZ ABC NULL NULL NULL 
2  John  NULL  Keith  NULL NULL 2344 NULL SQE FDG NULL NULL NULL 
3  William Stephen  NULL  45  NULL NULL NULL HJD ABC NULL NULL NULL 
4  Victor  NULL  Anthony NULL NULL NULL NULL NULL NULL NULL NULL NULL 

도와 주실 수 있습니까? 이 쿼리를 제대로 가져올 수 없습니다. SQL Server의 코드 사전에 2008

감사합니다,
수니타

+0

는 NameID는 자동 증가인가? – rownage

+1

TableA의 레코드에 대한 모든 필드가 함께 그룹화되거나 FirstName, MiddleName, LastName 만 일치해야합니까? FirstName, MiddleName, LastName이 같은 레코드가 두 개 있지만 다른 필드가 다른 경우 (예 : Phn1은 다르지만 이름과 다른 필드는 동일합니다). –

+0

NameID는 표 B의 들여 쓰기 열이며 자동 증가됩니다. – user1483122

답변

0

나는이 작업을 수행하는 가장 쉬운 방법은 두 쿼리라고 생각합니다. 첫 번째 문제는 TableA에서 중복 처리입니다. 다음 질의 각 이름의 조합에 대한 임의의 행을 선택한다 : 선택 TableB의() ()에서 에

인서트 (a를 선택 * 파티션 (위에 ROW_NUMBER()를 firstName을, 가운데 이름, 이름하여 성 순서)에 의해. TableA의에서을 임의로 로 )는 곳을 임의로 = 1

그런 다음, 원래의 테이블 갱신 : 당신의 필드 blan보다는 (NULL 값을 포함 할 경우

update TableA 
    set NameId = (select max(NameId) from TableB 
        where TableB.FirstName = TableA.FirstName and 
         TableB.MiddleName = TableA.MiddleName and 
         TableB.LastName = TableA.LastName 
       ) 
    where NameId is null 

을 KS), 당신은 가입 조건 COALESCE()를 사용할 수 있습니다

update TableA 
    set NameId = (select max(NameId) from TableB 
        where coalesce(TableB.FirstName, '<null>') = coalesce(TableA.FirstName, '<null>') and 
         coalesce(TableB.MiddleName, '<null>') = coalesce(TableA.MiddleName, '<null>') and 
         coalesce(TableB.LastName , '<null>')= coalesce(TableA.LastName, '<null>') 
       ) 
    where NameId is null 
+0

이 시나리오에서 coalesce()가 어떻게 작동하는지 알려주실 수 있습니까? TableB()에 삽입 할 수 있지만 FirstAccess, MiddleName 및 LastName이 NULL이 아닌 경우에만 TableA()의 업데이트가 발생합니다. – user1483122

+0

이 쿼리 비용을 줄이는 방법을 알려주시겠습니까? 현재 COALESCE를 사용하여 업데이트 표 A를 사용할 때 시간이 오래 걸립니다.테이블 A의 레코드 수는 307125이고 테이블 B는 239384입니다. – user1483122

0
DECLARE @results TABLE 
(
    NameID INT, 
    FirstName VARCHAR(32), -- guessing on data types for these columns 
    MiddleName VARCHAR(32), 
    LastName VARCHAR(32) 
); 

;WITH x AS 
(
SELECT FirstName, MiddleName, LastName, 
    rn = ROW_NUMBER() OVER (PARTITION BY FirstName, MiddleName, LastName 
     ORDER BY (SELECT NULL) 
    ) --, ... other columns ... 
    FROM dbo.TableA 
) 
INSERT dbo.TableB 
(
    FirstName, MiddleName, LastName --, ... other columns ... 
) 
OUTPUT 
    inserted.NameID, inserted.FirstName, 
    inserted.MiddleName, inserted.LastName 
INTO @results 
SELECT FirstName, MiddleName, LastName --, ... other columns ... 
FROM x WHERE rn = 1; 

UPDATE a SET NameID = r.NameID 
    FROM dbo.TableA AS a 
    INNER JOIN @results AS r 
    ON COALESCE(a.FirstName,'') = COALESCE(r.FirstName,'') 
    AND COALESCE(a.MiddleName,'') = COALESCE(r.MiddleName,'') 
    AND COALESCE(a.LastName,'') = COALESCE(r.LastName,''); 
+0

FirstName/MiddleName/LastName에 null 값이 있고 다음과 같이 errror가 발생하기 때문에 작동하지 않습니다. ""열에 NULL 값을 삽입 할 수 없습니다. MiddleName ', 테이블'@results '; 열이 널을 허용하지 않습니다. INSERT에 실패했습니다. "" 또한 테이블의 nullable 열에 대한 기본 키 제약 조건을 정의 할 수 없기 때문에 @results 테이블의 FirstName, MiddleName, LastName을 nullable로 만들 수 없습니다. – user1483122

+0

데이터 유형을 추측합니다. null 허용 여부 ... 추후에 테이블 정의를 게시하여 추측 할 필요가 없습니다. –