【问题标题】:Going from Select Statement to Delete从选择语句到删除
【发布时间】:2021-02-27 05:46:22
【问题描述】:

我有这个查询,发现有重复记录:

SELECT x.[Constituent Number], x.[First Name], x.[Last or Org Name],x.[Address Line 1], Cnt = Count(*) 
FROM (   
    SELECT SR.[Constituent Number], SR.[First Name], SR.[Last or Org Name], SR.[Address Line 1]
    FROM dbo.['All Salsa Records TL$'] SR

    UNION ALL

    SELECT WD.[Member Number], WD.[First Name], wd.[Last or Org Name], WD.[Address Line 1]
    FROM dbo.['Workling to delete$'] WD
) x
GROUP BY x.[Constituent Number], x.[First Name],x.[Last or Org Name],x.[Address Line 1]
HAVING COUNT(*) > 1

这是在两张桌子之间。我将如何从主表中删除记录以匹配此查询选择的结果?

编辑:我设法用这段代码弄明白了:

DELETE SR
--SELECT SR.[Constituent Number], SR.[First Name], SR.[Last or Org Name]
FROM dbo.['All Salsa Records TL$'] AS SR
LEFT OUTER JOIN dbo.['Workling to delete$'] WD
    ON WD.[Member Number] = SR.[Constituent Number]
    AND WD.[First Name] = SR.[First Name]
    AND WD.[Last or Org Name] = SR.[Last or Org Name] 
    AND WD.[Address Line 1] = SR.[Address Line 1]
    AND WD.[City]  = SR.[City]
    AND WD.[State] = SR.[State]
WHERE SR.[Constituent Number] = WD.[Member Number]
    AND WD.[First Name] = SR.[First Name]
    AND WD.[Last or Org Name] = SR.[Last or Org Name] 
    AND WD.[Address Line 1] = SR.[Address Line 1]
    AND WD.[City]  = SR.[City]
    AND WD.[State] = SR.[State]

对于空值,我只是使用了这个(并进行了相应的更改,因为我有 11 条记录为空成分,26 条记录为空地址):

DELETE SR
--SELECT SR.[Constituent Number], SR.[First Name], SR.[Last or Org Name]
FROM dbo.['All Salsa Records TL$'] AS SR
LEFT OUTER JOIN dbo.['Workling to delete$'] WD
    ON WD.[Member Number] = SR.[Constituent Number]
    AND WD.[First Name] = SR.[First Name]
    AND WD.[Last or Org Name] = SR.[Last or Org Name] 
    AND WD.[Address Line 1] IS NULL
    AND WD.[City] IS NULL
    AND WD.[State] IS NULL
WHERE SR.[Constituent Number] = WD.[Member Number]
    AND WD.[First Name] = SR.[First Name]
    AND WD.[Last or Org Name] = SR.[Last or Org Name] 
    AND SR.[Address Line 1] IS NULL
    AND SR.[City] IS NULL
    AND SR.[State] IS NULL

【问题讨论】:

    标签: sql sql-server sql-delete


    【解决方案1】:

    如果 ['All Salsa Records TL$'] 是您的主表,而 [Constituent Number] 是您要删除行的列,则:

    with cte as(
    SELECT x.[Constituent Number], x.[First Name], x.[Last or Org Name],x.[Address Line 1], Cnt = Count(*) 
    FROM (   
        SELECT SR.[Constituent Number], SR.[First Name], SR.[Last or Org Name], SR.[Address Line 1]
        FROM dbo.['All Salsa Records TL$'] SR
    
        UNION ALL
    
        SELECT WD.[Member Number], WD.[First Name], wd.[Last or Org Name], WD.[Address Line 1]
        FROM dbo.['Workling to delete$'] WD
    ) x
    GROUP BY x.[Constituent Number], x.[First Name],x.[Last or Org Name],x.[Address Line 1]
    HAVING COUNT(*) > 1)
    delete dbo.['All Salsa Records TL$'] where [Constituent Number]  in (select [Constituent Number] from cte)
    

    【讨论】:

    • 谢谢!我会试试这段代码进行测试!
    • 如果您遇到任何困难,请告诉我。
    • 不用担心 :)。我这样做只是为了测试和学习目的,所以如果我搞砸了也不会造成伤害。这些数据来自我拥有的一个 excel 文件。我运行了您的查询,它删除了 4,565 条记录,而连接删除非常接近。它是 2,471 条记录的选择查询中的 1 条记录。我很好奇 cte 删除的内容是什么推动了更高的记录。不过我可能已经想通了。我对计数 > 1 的组合成分数进行了计数,得到了 2,120。我将 excel 中的计数相加,得到了大约 4,248 的总和。我猜原始数据可能有重复。
    • 我有一个备份,以防万一我需要撤消。
    • 如果“组成编号”有多行,则删除的行数将多于选择,因为选择是基于分组依据进行的。你想删除这些行吗?那么您需要按条件添加所有列。
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多