代码之家  ›  专栏  ›  技术社区  ›  Skitzafreak

删除查询中找到的所有数据[重复]

  •  0
  • Skitzafreak  · 技术社区  · 7 年前

    我正在做一个数据库项目,为了保持头脑清醒,我想在测试其他特性时从数据库中删除所有有问题的数据。

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

    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 ,我不确定如何构造此查询以使其执行我希望它执行的操作。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Lamak    7 年前

    一种方法是使用 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
  •  0
  •   Tom Baker    7 年前

    你能按订单号删除吗?如果是这样的话,你可以从技术上尝试

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

    这将选择上面包含的同一个选择列表,但实际上只选择订单ID,从而返回要删除的订单ID列表

    然而,正如所指出的,只有当order\u id是主键时,这才有效!伊普,我承认不完美