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'
从这个优秀的 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'