具有相同id的多个记录使Cursor为NULL

时间:2016-09-08 05:03:49

标签: mysql sql sql-server sql-server-2012

我有问题,需要针对给定示例的解决方案。记录数为500k,其中的情况如下所示。

例如,我们有下表,其中有重复记录。对于每个客户端,在发生重复的情况下,附加的UID与之前的给定相同。但总的不同记录中很少有相同的ID。如Gail,Jacob和Kimberley,111152与UID相同,Ritesh和Samuel有111119。

FirstName       MiddleName    LastName    Phone    UID

Ainsley             J       Lee         354782      111153
Ainsley             J       Lee         354782      111153
Alexandros-Michail  Michail Charaktsis  234561      111154
chanthy                     lim         451897      111155
chanthy                     lim         451897      111155
chanthy                     lim         451897      111155
chanthy             Bbb     lim         451897      111155
Colin                       Mann        123456      111111
Emin                P       Halilovic   245124      111113
Emin                P       Halilovic   245124      111113
Emin                P       Halilovic   245124      111113
Gail                        Algewatta   124579      111152
Gail                        Algewatta   124579      111152
Jacob               Lin     John        965821      111152
Kimberley           J       Jones       985478      111152
Lauren                      Green       284531      111158
Lauren                      Green       284531      111158
Lauren                      Green       284531      111158
Lauren              M       Green       284531      111158
Linda               Ben     Edge        987456      111159
Linda               Ben     Edge        987456      111159
Mitchell            K       Kable       875492      111160
Mitchell            Kyle    Kable       875492      111160
Mitchell            Kyle    Kable       875492      111160
Mitchell            Kyle    Kable       875492      111160
Mitchell            Kyle    Kable       875492      111160
Ritesh              K       Khadgi      264518      111119
Samuel              P       Marshall    564823      111119
Samuel              peter   Marshall    564823      111119
Samuel              peter   Marshall    564823      111119

现在我已经开发了一个游标,在那里我需要你的帮助来找出那些记录并使它们的UID为NULL。 光标如下所示。

DECLARE @FirstName NVARCHAR(255),@MiddleName NVARCHAR(255),@LastName NVARCHAR(255),
        @DOB NVARCHAR(255), @Mobile FLOAT, @UID FLOAT
DECLARE @dt TABLE (UID NUMERIC(18,0), FirstName NVARCHAR(255), MiddleName NVARCHAR(255), LastName NVARCHAR(255))

--Cursor
DECLARE cursor1 CURSOR FOR
SELECT FirstName, MiddleName, LastName, DOB, Mobile, UID
FROM MAWork.dbo.gcs_customer_eight


OPEN cursor1
FETCH NEXT FROM cursor1
INTO @FirstName,@MiddleName,@LastName, @DOB, @Mobile, @UID
WHILE @@FETCH_STATUS = 0
BEGIN


IF EXISTS (SELECT 1 FROM MAWork.dbo.gcs_customer_eight WHERE  ((@FirstName!=FirstName AND @LastName!=LastName AND @DOB!=DOB AND @Mobile!=Mobile) OR
                                                                            (@FirstName!=FirstName AND @MiddleName!=MiddleName AND @LastName!=LastName AND @DOB!=DOB AND @Mobile!=Mobile) OR
                                                                            (@FirstName!=FirstName AND @MiddleName!=MiddleName AND @LastName!=LastName AND @DOB!=DOB) AND @UID = UID ))
BEGIN

        INSERT INTO @dt 
        SELECT UID, FirstName, MiddleName, LastName FROM MAWork.dbo.gcs_customer_eight WHERE ((@FirstName!=FirstName AND @LastName!=LastName AND @DOB!=DOB AND @Mobile!=Mobile) OR
                                                                            (@FirstName!=FirstName AND @MiddleName!=MiddleName AND @LastName!=LastName AND @DOB!=DOB AND @Mobile!=Mobile) OR
                                                                            (@FirstName!=FirstName AND @MiddleName!=MiddleName AND @LastName!=LastName AND @DOB!=DOB) AND @UID = UID )

        --GOTO UpsertRecord
END
ELSE 
BEGIN
    GOTO NextRecord
END

/*UpsertRecord:
IF EXISTS (SELECT 1 FROM @dt)
            UPDATE @dt SET UID = (SELECT TOP 1 UID FROM @dt )
        ELSE

        END

        DELETE FROM @dt
        GOTO NextRecord*/

NextRecord:
    FETCH NEXT FROM cursor1 
    INTO @FirstName,@MiddleName,@LastName, @DOB, @Mobile, @UID

END
CLOSE cursor1
DEALLOCATE cursor1 

结束结果

最终结果应该是具有相同UID的所有不同客户端,应删除它们的UID并使其为NULL。

任何帮助都非常值得注意。 感谢。

3 个答案:

答案 0 :(得分:0)

您不需要逐行处理数据。

要查找和更新属于多个名称的所有UID,您可以执行以下操作:

UPDATE <your table>
SET UID = NULL
WHERE UID in
(
    SELECT UID
    FROM <your table>
    GROUP BY UID
    HAVING COUNT(DISTINCT ... e.g. Full Name ...) > 1
)

答案 1 :(得分:0)

使用以下查询更新表格:

set UID=Null
where UID in
(select uid from
(select SELECT UID,row_number() over (partition by column1,column2,column3.. oreder by UID as rnm FROM table)res
    where res.rnm>1)

答案 2 :(得分:0)

尝试这个

UPDATE客户端SET UID = NULL WHERE UID in (从客户端GROUP BY UID中选择UID     具有计数(DISTINCT全名,UID)&gt; 1)