Sql 删除某些列中具有重复值的记录?

Sql 删除某些列中具有重复值的记录?,sql,sql-server,duplicate-removal,Sql,Sql Server,Duplicate Removal,我有下表STG和200万条记录- STG(ACCT_NUM,NAME,ADDRESS,CITY,STATE) 我添加了SSN nvarchar255 NULL列,并重新插入了200万条记录。现在我想删除在SSN中没有任何值但其他列值匹配的重复记录,因为某些记录的SSN被插入为null 我想删除那些所有其他列值都匹配但SSN不匹配的重复记录。存在一些SSN为空的唯一记录。我不希望删除它们。这就是删除SSN为空值的记录所需的全部内容 DELETE FROM STG WHERE SSN IS NUL

我有下表STG和200万条记录-

STG(ACCT_NUM,NAME,ADDRESS,CITY,STATE)
我添加了SSN nvarchar255 NULL列,并重新插入了200万条记录。现在我想删除在SSN中没有任何值但其他列值匹配的重复记录,因为某些记录的SSN被插入为null


我想删除那些所有其他列值都匹配但SSN不匹配的重复记录。存在一些SSN为空的唯一记录。我不希望删除它们。

这就是删除SSN为空值的记录所需的全部内容

DELETE FROM STG
WHERE SSN IS NULL;
编辑:

下面是一个MySQL解决方案,用于您尝试执行的操作,给出以下注释:

DELETE FROM STG
    WHERE SSN IS NULL
    AND (ACCT_NUM, NAME, ADDRESS, CITY, STATE)
    IN (SELECT ACCT_NUM, NAME, ADDRESS, CITY, STATE FROM 
        (SELECT * FROM STG) AS STG1 WHERE SSN IS NOT NULL);

这里有点猜测,因为信息不完整,而且需求目前相互冲突

with MyDeleteCTE as
(
    SELECT 
        ACCT_NUM
        ,NAME
        ,ADDRESS
        ,CITY
        ,STATE
    FROM STG s1
    left join STG s2 on 
        s1.ACCT_NUM = s2.ACCT_NUM
        and s1.NAME = s2.NAME
        and s1.ADDRESS = s2.ADDRESS
        and s1.CITY = s2.CITY
        and s1.STATE = s2.STATE
        and s1.SSN <> s2.SSN
)

delete MyDeleteCTE

请告诉我你的SSN栏不是社会保险号码。如果是,请告诉我它们是加密的。除非确实需要,否则不应存储SSN。帮你自己和你的公司一个忙,如果不早的话,马上把它们加密。此数据非常敏感,不加密对您的公司来说是不负责任和危险的。@SeanLange-谢谢Sean,但它不是社会安全号码。无论如何谢谢你!LOL使用有意义的名称而不是缩写的另一个原因:您已编辑问题,但存在冲突信息。首先,您说要删除没有SSN的行,然后您说要保留其中的一些行。这里有什么规定?
DELETE s1
    FROM STG s1
    INNER JOIN STG s2 on 
        s1.ACCT_NUM = s2.ACCT_NUM
        and s1.NAME = s2.NAME
        and s1.ADDRESS = s2.ADDRESS
        and s1.STATE = s2.STATE
        and s1.CITY = s2.CITY
        and s1.SSN <> s2.SSN
        and (isnull(s1.SSN,'')='' OR s1.SSN is null)