0

Должен быть лучший способ сделать это.TSQL flag дублирует записи с единственным уникальным идентификатором

У меня есть таблица, в которой я помеченный все уникальные записи, как это:

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, который работает, но это занимает очень много времени. Вот 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?

ответ

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

Ницца! Еще лучше, если я запустил последнее обновление, предлагаемое без «И dt1.ParentId IS NOT NULL», мне не нужно запускать свое первое обновление, чтобы отметить uniques. – 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

Смежные вопросы