SQL - 删除从查询结果中筛选出的行

SQL - Delete rows filtered from a query result

从这个优秀的 post 中,我现在更好地理解了如何使用 Join 来 return 具有来自不同表的相似引用的结果列表。

我在 运行 Select 查询

之后的结果中显示了该列表
select 
    a.OrderDate,
    c.StaffID,
    c.Activate  
from
    tbl_Order a

join tbl_OrderDetails b
    on a.OrderID = b.OrderID

join tbl_Staff c
    on b.StaffID = c.StaffID

where c.Activate = 'False'

但是,如何使用该结果列表并从 tbl_Order 中删除那些行?

如有疑问,请使用 exists:

delete 
from tbl_order a
where exists 
(
select 1 
from tbl_OrderDetails b
inner join tbl_staff c
on b.StaffID = c.StaffID
and c.Activate = 'False'
where b.Order_id = a.Order_id
)

您还可以使用通用 table 表达式来分离结果集的查询并删除结果集中存在的数据和所需的数据 table:

 WITH cte AS
     (
     select 
    a.OrderDate,
    c.StaffID,
    c.Activate  
from
    tbl_Order a

join tbl_OrderDetails b
    on a.OrderID = b.OrderID

join tbl_Staff c
    on b.StaffID = c.StaffID

where c.Activate = 'False'
     )
     Delete
     FROM cte t1
     INNER JOIN tbl_Order t2
     ON t1.Order_id = t2.Order_id;

您可以使用 DELETE FROM WHERE ()IN () 形式,它在您的代码中是这样的:

DELETE FROM
  tbl_Order k
WHERE (k.OrderID) IN (
  SELECT
    a.OrderID 
  FROM
    tbl_Order a
  JOIN tbl_OrderDetails b
    ON a.OrderID = b.OrderID
  JOIN tbl_Staff c
    ON b.StaffID = c.StaffID
  WHERE c.Activate = 'False' )

使用 SELECT 提取要删除的 OrderID,DELETE 的 WHERE 仅选择具有将被删除的 ID 的行。

您可以像使用 SELECT 一样在 DELETE 中使用 JOIN。只需确保 Delete 中的别名来自您要从中删除数据的 table。

DELETE a 
FROM
    tbl_Order a
INNER JOIN tbl_OrderDetails b
    on a.OrderID = b.OrderID
INNER JOIN tbl_Staff c
    on b.StaffID = c.StaffID
WHERE c.Activate = 'False'