0

이 할 수있는 더 좋은 방법이 될 수 있습니다. TSQL 플래그 중복 레코드가있다

WITH 
    CTE(TransId, OriginalName, StrippedName, RowNumber) 
    AS 
    (
     SELECT TransID , 
       Name , 
       StrippedName, 
       RN = ROW_NUMBER() OVER (PARTITION BY StrippedName ORDER BY StrippedName) 
     FROM dbo.Members 
    ) 

UPDATE dbo.Members 
SET ParenId = TransID 
WHERE TransID IN (SELECT TransId FROM CTE WHERE RowNumber = 1) 

지금 내가 좋아하는 것

모든 중복 레코드를 업데이트하는 (여기서 ROWNUMBER> 1) 고유 ParentId에 :

는 나는이 같은 모든 고유 한 기록을 플래그 테이블이있다. 지금은 작동하는 UDF를 사용하고 있지만 매우 오랜 시간이 걸립니다. 내가 현재 사용하고 업데이트 문 여기

CREATE FUNCTION dbo.getParentTransId (@TransId INT, @strippedBusName VARCHAR(200)) 
RETURNS INT 
AS 
BEGIN 
    DECLARE @ParentTransId INT 

    SELECT @ParentTransId = TransId 
    FROM dbo.Members 
    WHERE StrippedBusName = @strippedBusName 
     AND ParenId IS NOT NULL 

    IF @ParentTransId IS NULL 
    BEGIN 
     SET @ParentTransId = @TransId 
    END 

    RETURN @ParentTransId 
END 
GO 

그리고 :

UPDATE dt 
SET dt.ParenId = dbo.getParentTransId (dt.TransID, dt.StrippedBusName) 
FROM dbo.Members dt 
GO 

는 UDF를 사용하지 않고 동일한 업데이트를 할 수있는 방법이 여기에 UDF입니까?

답변

0

나는이 일을해야 같아요

UPDATE dbo.Members dt 
SET dt.ParenId = COALESCE((SELECT TrandsID FROM dbo.Members WHERE dt.StrippedBusName = StrippedBusName AND ParenId IS NOT NULL), dt.TransId) 

난 잘 모르겠지만, 다음과 같은 방법이 있어야합니다 빠른 하나

여기
UPDATE dbo.Members dt 
SET dt.ParenId = COALESCE(dt1.TransId, dt.TransId) 
FROM dbo.Members dt 
LEFT JOIN dbo.Members dt1 
    ON dt.StrippedBusName = dt1.StrippedBusName 
    AND dt1.ParenId IS NOT NULL 
+0

니스! 내가 마지막 업데이트없이 제안 실행하면 더 나은입니다 "AND dt1.ParentId가 NULL이"나는 플래그에 순 방문자를 내 첫 번째 업데이트를 실행할 필요가 없습니다. – mwhib

1

이 @gotqn 답을 표시하는 테스트 스크립트입니다 작동 :

-- create table 
CREATE TABLE DupUpdateTest 
(
    Id  INT NOT NULL PRIMARY KEY IDENTITY(1, 1), 
    TransId INT NOT NULL, 
    OriginalName VARCHAR(MAX), 
    StrippedName VARCHAR(MAX), 
    ParentId INT NULL 
) 
GO 

-- insert data 
INSERT INTO dbo.DupUpdateTest VALUES (2, 'name 1', 'name1', NULL) 
INSERT INTO dbo.DupUpdateTest VALUES (3, 'name 1', 'name1', NULL) 
INSERT INTO dbo.DupUpdateTest VALUES (6, 'name 1', 'name1', NULL) 
INSERT INTO dbo.DupUpdateTest VALUES (8, 'name 2', 'name2', NULL) 
INSERT INTO dbo.DupUpdateTest VALUES (11, 'name 2', 'name2', NULL) 
INSERT INTO dbo.DupUpdateTest VALUES (15, 'name 55', 'name55', NULL) 
INSERT INTO dbo.DupUpdateTest VALUES (23, 'name 55', 'name55', NULL) 
INSERT INTO dbo.DupUpdateTest VALUES (99, 'name 100', 'name100', NULL) 
INSERT INTO dbo.DupUpdateTest VALUES (122, 'name 108', 'name108', NULL) 

-- update parent id match 
UPDATE dt 
SET dt.ParentId = COALESCE(dt1.TransId, dt.TransId) -- Returns the first nonnull expression among its arguments 
FROM dbo.DupUpdateTest dt 
LEFT JOIN dbo.DupUpdateTest dt1 
    ON dt.StrippedName = dt1.StrippedName 

-- view results 
SELECT * FROM dbo.DupUpdateTest 
+0

+1 그리고 내가 도움을 관리 기쁘다. – gotqn