2014-06-17 3 views
1

나는 SQL Server의 초보자 그리고 난 많은 어려움이 다음과 같은 작업을 해결할 수 있습니다업데이트 열은

User_Info에서
User_Info 
    User_UID UNIQUEIDENTIFIER ROWGUIDCOL NULL DEFAULT(newid()) 
    FirstName VARCHAR(50) 
    LastName VARCHAR(50) 
    Email VARCHAR(50) 

Session 
    User_UID CHAR(40) 
    Session_ID PK INT 

내가 다른 User_UID에 해당하는이 : 내가 2 개 테이블이 동일한 사용자, 즉 성, 성 및 이메일이 동일한 사용자.

User_Info 테이블을 정리하려면 중복 된 사용자 (이름, 성 및 전자 메일이 아닌 Null이 아니며 비어 있지 않음)를 삭제하고 세션 테이블의 User_UID 열을 해당 user_uid로 업데이트해야합니다. User_Info 테이블과 동일한 사용자를 가리 킵니다. 2 행 User_info (행 2 열 (6) (또는도 1 및도 5의 순서에 따라))로부터 삭제되어야

CREATE TABLE user_info (
    User_UID uniqueidentifier ROWGUIDCOL NULL DEFAULT (newid()), 
    FirstName varchar(50), 
    LastName varchar(50), 
    Email varchar(50) 
) 

INSERT user_info VALUES(newid(), 'Marc', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Marc', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Estelle', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Estelle', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Tony', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), 'Tony', 'Jalloul', '[email protected]') 
INSERT user_info VALUES(newid(), '', 'Mirebeau', '[email protected]') 
INSERT user_info VALUES(newid(), '', 'Mirebeau', '[email protected]') 
INSERT user_info VALUES(newid(), NULL, 'Mirebeau', '[email protected]') 
INSERT user_info VALUES(newid(), NULL, 'Mirebeau', '[email protected]') 

CREATE TABLE session (
    session_id INT IDENTITY(1, 1), 
    User_UID char(40) 
) 

INSERT Session 

SELECT User_UID FROM user_info 

예상 결과와 2 행의 User_UID과 :

내 테이블이다 세션 테이블의 6 번은 각각 행 1과 5의 User_UID로 업데이트되어야합니다.

는 User_Info에서 중복 사용자 삭제하려면 내 코드입니다 :

DELETE UI 
FROM (
    SELECT * 
     ,row_number() OVER (
      PARTITION BY FirstName 
      ,LastName 
      ,Email ORDER BY User_UID 
      ) AS RowNum 
    FROM user_info 
    WHERE FirstName IS NOT NULL 
     AND FirstName <> '' 
     AND LastName IS NOT NULL 
     AND LastName <> '' 
     AND Email IS NOT NULL 
     AND Email <> '' 
    ) r 
INNER JOIN user_Info UI 
    ON r.User_UID = UI.User_UID 
WHERE r.RowNum > 1 

을하지만 사람이 도움을 줄 수있는 경우 커서

를 사용하지 않고 세션 테이블의 User_UID 필드를 업데이트하는 아직 방법을 찾지 못했습니다 나와 나에게이 작업의 코드를 제공 할 수

감사

+0

질문 - 중복 사용자를 삭제할 때 왜 '세션'테이블에 레코드를 보관해야합니까? –

+0

그냥 User_Info 테이블을 정리하고 – user3569267

답변

2

당신은 삭제 된 행을 얻을 수있는 OUTPUT 절을 사용할 수있는 결과에서 세션을 업데이트하고 user_info에 참여합니다.

Declare @tab Table (User_UID uniqueidentifier 
       , FirstName varchar(50), 
        LastName varchar(50), 
        Email varchar(50)) 

DELETE UI 
OUTPUT Deleted.* into @tab 
FROM (
    SELECT * 
     ,row_number() OVER (
      PARTITION BY FirstName 
      ,LastName 
      ,Email ORDER BY User_UID 
      ) AS RowNum 
    FROM user_info 
    WHERE FirstName IS NOT NULL 
     AND FirstName <> '' 
     AND LastName IS NOT NULL 
     AND LastName <> '' 
     AND Email IS NOT NULL 
     AND Email <> '' 
    ) r 
INNER JOIN user_Info UI 
    ON r.User_UID = UI.User_UID 
WHERE r.RowNum > 1 



update Session 
set User_UID=u.User_UID 
from @tab t 
join user_info u on t.FirstName=u.FirstName and t.LastName=u.Lastname and t.Email=u.Email 
where t.User_UID=session.User_UID 
+0

+1을 삭제하지 않고 모든 session_ID를 유지하려고합니다. Everoyne은 출력 절을 읽습니다. SQL의 커다란 문제를 해결해 주며, 변경된 값을 알면 멋집니다. – TomTom

+0

안녕하세요, 다음 코드 : 업데이트 세션 집합 User_UID = u.User_UID from @tab t user_info u에 가입하십시오. t.FirstName = u.FirstName 및 t.LastName = u.Lastname 및 t.Email = u.Email 모든 세션 테이블 행을 업데이트하십시오. 예상 결과는 행 2와 6 (또는 1과 5) 만 업데이트해야합니다. 도움을 주셔서 감사합니다 – user3569267

+0

@ user3569267 죄송합니다. 'where t.User_UID = session.User_UID' – bummi