我有问题,需要针对给定示例的解决方案。记录数为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。
任何帮助都非常值得注意。 感谢。
答案 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)