【问题标题】:Delete All Data Found With Query [duplicate]删除通过查询找到的所有数据 [重复]
【发布时间】:2018-11-25 08:42:39
【问题描述】:

我正在处理一个数据库项目,为了保持理智,我想在测试其他功能时从数据库中删除所有问题数据。

我目前编写了一些查询来帮助我找到我的问题数据集,如下面的代码:

SELECT Order_ID, Part_Number, COUNT(*)
FROM Temp_A
GROUP BY Order_ID, Part_Number
HAVING COUNT(*) > 1

现在我希望能够从临时表中删除通过这些查询找到的所有数据。但是将代码放入:

DELETE FROM Temp_A
WHERE IN (/*MY QUERY*/)

似乎不起作用,因为我收到了语法错误。我已经尝试删除 IN,将 WHERE 更改为 WITH,我不确定如何构建此查询以使其执行我想要执行的操作。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    一种方法是使用INNER JOIN

    DELETE A
    FROM Temp_A A
    INNER JOIN (SELECT Order_ID, Part_Number, COUNT(*)
                FROM Temp_A
                GROUP BY Order_ID, Part_Number
                HAVING COUNT(*) > 1) B
        ON A.Order_ID = B.Order_ID
        AND A.Part_Number = B.Part_Number
    ;
    

    如果您使用的是 SQL Server 2005+,那么您可以使用CTE

    WITH CTE AS
    (
        SELECT  *,
                N = COUNT(*) OVER(PARTITION BY OrderID, Part_Number)
        FROM Temp_A
    )
    DELETE FROM CTE
    WHERE N > 1
    ;
    

    【讨论】:

    • 这对我有用,谢谢。
    【解决方案2】:

    您可以通过 Order_ID 删除吗?如果是这样,您可以在技术上尝试以下方法

    DELETE FROM Temp_A
    where Order_ID IN(
       SELECT Order_ID
       FROM Temp_A
       GROUP BY Order_ID, Part_Number
       HAVING COUNT(*) > 1)
    

    这将选择您上面包含的相同选择列表,但仅实际选择 Order_ID,从而返回您要删除的 Order_ID 列表

    然而,正如所指出的,这仅在 Order_ID 是主键时才有效!哎呀,我承认并不完美

    【讨论】:

    • 但是如果Order_IdPart_Number 的组合只出现一次,而同样的Order_Id 和另一个Part_Number 出现不止一次呢?....你会删除该Order_Id的所有结果
    • 你是对的:O 我想我假设 Order_ID 是不可复制的主键。我想我的想法只适用于那种情况,我会更新我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2015-06-21
    • 2017-06-13
    • 1970-01-01
    • 2014-05-24
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多