删除查询中找到的所有数据

时间:2018-06-15 13:32:01

标签: sql sql-server

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

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

def update(self):
        ret, frame = self.video.read()
        if self.ok:
            self.out.write(frame)
        if ret:
            self.photo = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(frame))
            self.canvas.create_image(0, 0, image=self.photo, anchor=tkinter.NW)

        self.window.after(self.delay, self.update)

现在我希望能够从Temp Table中删除我在这些查询中找到的所有数据。但是将代码放在:

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

2 个答案:

答案 0 :(得分:2)

一种方法是使用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
;

答案 1 :(得分:0)

可以通过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是主键的情况下才会有效! eep,所以不完美我承认