Слияние записей по найденному совпадению - PullRequest
0 голосов
/ 06 апреля 2020

Я столкнулся с проблемой, когда мне нужно исправить некоторые исторические данные c. Он содержит огромное количество данных. Чтобы исправить эти исторические данные, мне нужно объединить их с помощью найденного совпадения. Дайте мне знать, если это дубликат какой-либо другой задачи.

Вот структура таблицы:

CREATE TABLE Contacts
(
    Id INT PRIMARY KEY, 
    FirstName VARCHAR(50), 
    LastName VARCHAR(50), 
    Email VARCHAR(50), 
    Mobile VARCHAR(50),
    Notes VARCHAR(MAX),
)

Логос слияния c будет выглядеть примерно так:

 --When all 4 fields(firstName, lastName, Email, Mobile) are matching for more then one contact, merge them together
 --when one record has all 4 fields, another records has only 3 matching and 4th one as null, merge them,
 --when one record has all 4 fields, another records has only 2 matching and remaining two as null, merge them,
 --when one record has all 4 fields, another records has only 1 matching and remaining three as null, merge them,


 --when one record has 3 fields and 4th field is NULL, another record has exacly same matching records, merge them,
 --when one record has 3 fields and 4th field is NULL, another records has only 1 matching and remaining three as null, merge them,
 --when one record has 3 fields and 4th field is NULL, another records has only 2 matching and remaining two as null, merge them,
 --when one record has 3 fields and 4th field is NULL, another records has only 1 matching and remaining three as null, merge them,

 --when one record has 2 fields and 2 fields as NULL, another record has exacly same matching records, merge them,
 --when one record has 2 fields and 2 fields as NULL, another records has only 1 matching  field and remaining three as null, merge them,

 --when one record has 1 fields and 3 fields as NULL, another record has exacly same matching, merge them,

Когда я говорю, объединить их, это означает, что объединить два элемента в один и удалить оставшийся. Я пытался сделать это с помощью курсора в списке контактов, но это не помогает мне со всеми этими комбинациями.

Я не смог найти здесь ни одного такого поста, откуда я мог бы получить какую-либо подсказку. Было бы полезно любое руководство по написанию запроса для выполнения этой операции.

1 Ответ

0 голосов
/ 06 апреля 2020

Что бы ни было с производительностью в CURSOR, учитывая множество условий, вы можете попробовать эту опцию ниже, используя CURSOR, и проверить ваше требование, полное заполнение или нет-

ДЕМО ЗДЕСЬ

DECLARE 
    @FirstName VARCHAR(MAX),
    @LastName VARCHAR(MAX),
    @Email VARCHAR(MAX),
    @Mobile  VARCHAR(MAX),

    @FirstName_prev VARCHAR(MAX),
    @LastName_prev VARCHAR(MAX),
    @Email_prev VARCHAR(MAX),
    @Mobile_prev  VARCHAR(MAX),

    @loop_start  INT = 0;

DECLARE @tmp TABLE(
    FirstName VARCHAR(MAX),
    LastName VARCHAR(MAX),
    Email VARCHAR(MAX),
    Mobile  VARCHAR(MAX)
);

DECLARE cursor_Contacts CURSOR
FOR SELECT FirstName,LastName,Email,Mobile
    FROM Contacts
    ORDER BY 
    ISNULL(FirstName,'ZZZZZZZZZZZZZZZ')
    ,ISNULL(LastName,'ZZZZZZZZZZZZZZZ')
    ,ISNULL(Email,'ZZZZZZZZZZZZZZZ')
    ,ISNULL(Mobile,'ZZZZZZZZZZZZZZZ');

OPEN cursor_Contacts;

FETCH NEXT FROM cursor_Contacts INTO 
     @FirstName,@LastName,@Email,@Mobile;

WHILE @@FETCH_STATUS = 0
    BEGIN

        IF @loop_start = 0

        BEGIN

            INSERT INTO @tmp(FirstName,LastName,Email,Mobile)
            VALUES (@FirstName,@LastName,@Email,@Mobile)

            SET @loop_start = 1

        END

        ELSE
        BEGIN

            IF
            (@FirstName_prev = @FirstName OR @FirstName IS NULL) AND
            (@LastName_prev = @LastName OR @LastName IS NULL) AND
            (@Email_prev = @Email OR @Email IS NULL) AND
            (@Mobile_prev = @Mobile OR @Mobile IS NULL)

            BEGIN
                SET @loop_start = 1
            END

            ELSE
            BEGIN
                SET @loop_start = 2

                INSERT INTO @tmp(FirstName,LastName,Email,Mobile)
                VALUES (@FirstName,@LastName,@Email,@Mobile)
            END
        END;


        SET @FirstName_prev = @FirstName
        SET @LastName_prev= @LastName
        SET @Email_prev = @Email
        SET @Mobile_prev= @Mobile;


        FETCH NEXT FROM cursor_Contacts INTO 
            @FirstName,@LastName,@Email,@Mobile;
    END;

CLOSE cursor_Contacts;

SELECT * FROM @tmp;

DEALLOCATE cursor_Contacts;
...