msSQL 多删除多连接
msSQL multi delete multi join
我想在条件为真时从多个表中删除多行。
我可以 select 我想用这个删除的东西:
select *
from ProcessStepSt01
left join ProcessStepSt02 on ProcessStepSt01.Workpiece=ProcessStepSt02.Workpiece
left join ProcessStepSt03 on ProcessStepSt01.Workpiece=ProcessStepSt03.Workpiece
where ProcessStepSt01.Workpiece
in (
select Workpiece from Workpieces
where datediff(day,workpieces.CreationTime,current_timestamp)>=30
)
所有ProcessStepStXX都包含Workpiece(主键)、TeilIO、Start、Ende和TeilVorh。所以结果是
Workpiece TeilIO TeilVorh Start Ende Workpiece_1 TeilIO_1 ... Workpiece_2 ...
1111 1 1 1 1 (null) (null) (null)
abc 1 1 1 1 abc 1 abc
但是当我用 delete 替换 select * 时,我得到一个错误:"wrong syntax next to the left keyword"
我也试过了
delete ProcessStepSt01,ProcessStepSt02,ProcessStepSt03
(select * 之后的所有内容保持不变)
但我得到“‘,’附近的语法错误”
我想要实现的是删除 ProcessStepSt01、ProcessStepSt02、ProcesStepSt03 中工件与 in(...) 语句中的 selection 匹配的所有行。
所以这是我的问题:
- 为什么我的语法不起作用?
- 我如何让它发挥作用?
最后我想定期做
CREATE TRIGGER TRG_AutoRemove
ON workpieces
AFTER INSERT AS
BEGIN
...
END
但我认为每次插入都这样做有点矫枉过正(大约每两到三秒插入一次)。
有没有办法每隔 hour/day 做一次?
请注意:我使用的是 MSSQL。
感谢您的建议。
不能同时删除多个table,需要使用三个删除语句。但是,由于在这种情况下所有 table 都有工件,因此语句很简单。
DELETE
FROM ProcessStepSt03
WHERE Workpiece
IN (
SELECT Workpiece FROM Workpieces
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30)
DELETE
FROM ProcessStepSt02
WHERE Workpiece
IN (
SELECT Workpiece FROM Workpieces
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30)
DELETE
FROM ProcessStepSt01
WHERE Workpiece
IN (
SELECT Workpiece FROM Workpieces
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30)
您可以通过 SQL 代理定期将作业安排到 运行。
当然,如果其中一个 ProcessStep tables 是主要的,并且没有它,其他记录就不可能存在(即,如果没有 ProcessStepSt01,那么 ProcessStepSt02 或 ProcessStepSt03 中就不能存在记录)然后你可以设置从 02 和 03 到 01 的外键关系,并进行级联删除。那么你只需要从ProcessStepSt01中删除,其他记录会自动删除。
为了完整起见,如果您确实想在删除语句中加入 tables,您可以使用如下语法:
DELETE PS1
FROM ProcessStepSt01 PS1
JOIN Workpieces W ON PS1.Workpiece = W.Workpiece
WHERE DATEDIFF(day, W.CreationTime, current_timestamp) >= 30
这仍然只允许您从 JOIN 中的 table 之一删除,但可以说它比使用子查询要好一些,有时您无法实现您需要的功能加入。
好的,这里有很多事情。
第一:你不能同时从3个表中删除,你需要三个单独的语句。
delete
from ProcessStepSt01
where Workpiece
in (
select Workpiece from Workpieces
where datediff(day,workpieces.CreationTime,current_timestamp)>=30
)
其他表也一样。
为了使其每天 运行 一次,使用 SQL Server Agent 创建一个作业。
将您的语句放在 T-SQL 步骤中,并安排每天一次。
我想在条件为真时从多个表中删除多行。
我可以 select 我想用这个删除的东西:
select *
from ProcessStepSt01
left join ProcessStepSt02 on ProcessStepSt01.Workpiece=ProcessStepSt02.Workpiece
left join ProcessStepSt03 on ProcessStepSt01.Workpiece=ProcessStepSt03.Workpiece
where ProcessStepSt01.Workpiece
in (
select Workpiece from Workpieces
where datediff(day,workpieces.CreationTime,current_timestamp)>=30
)
所有ProcessStepStXX都包含Workpiece(主键)、TeilIO、Start、Ende和TeilVorh。所以结果是
Workpiece TeilIO TeilVorh Start Ende Workpiece_1 TeilIO_1 ... Workpiece_2 ...
1111 1 1 1 1 (null) (null) (null)
abc 1 1 1 1 abc 1 abc
但是当我用 delete 替换 select * 时,我得到一个错误:"wrong syntax next to the left keyword"
我也试过了
delete ProcessStepSt01,ProcessStepSt02,ProcessStepSt03
(select * 之后的所有内容保持不变)
但我得到“‘,’附近的语法错误”
我想要实现的是删除 ProcessStepSt01、ProcessStepSt02、ProcesStepSt03 中工件与 in(...) 语句中的 selection 匹配的所有行。
所以这是我的问题:
- 为什么我的语法不起作用?
- 我如何让它发挥作用?
最后我想定期做
CREATE TRIGGER TRG_AutoRemove
ON workpieces
AFTER INSERT AS
BEGIN
...
END
但我认为每次插入都这样做有点矫枉过正(大约每两到三秒插入一次)。
有没有办法每隔 hour/day 做一次?
请注意:我使用的是 MSSQL。
感谢您的建议。
不能同时删除多个table,需要使用三个删除语句。但是,由于在这种情况下所有 table 都有工件,因此语句很简单。
DELETE
FROM ProcessStepSt03
WHERE Workpiece
IN (
SELECT Workpiece FROM Workpieces
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30)
DELETE
FROM ProcessStepSt02
WHERE Workpiece
IN (
SELECT Workpiece FROM Workpieces
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30)
DELETE
FROM ProcessStepSt01
WHERE Workpiece
IN (
SELECT Workpiece FROM Workpieces
WHERE datediff(day,workpieces.CreationTime,current_timestamp)>=30)
您可以通过 SQL 代理定期将作业安排到 运行。
当然,如果其中一个 ProcessStep tables 是主要的,并且没有它,其他记录就不可能存在(即,如果没有 ProcessStepSt01,那么 ProcessStepSt02 或 ProcessStepSt03 中就不能存在记录)然后你可以设置从 02 和 03 到 01 的外键关系,并进行级联删除。那么你只需要从ProcessStepSt01中删除,其他记录会自动删除。
为了完整起见,如果您确实想在删除语句中加入 tables,您可以使用如下语法:
DELETE PS1
FROM ProcessStepSt01 PS1
JOIN Workpieces W ON PS1.Workpiece = W.Workpiece
WHERE DATEDIFF(day, W.CreationTime, current_timestamp) >= 30
这仍然只允许您从 JOIN 中的 table 之一删除,但可以说它比使用子查询要好一些,有时您无法实现您需要的功能加入。
好的,这里有很多事情。 第一:你不能同时从3个表中删除,你需要三个单独的语句。
delete
from ProcessStepSt01
where Workpiece
in (
select Workpiece from Workpieces
where datediff(day,workpieces.CreationTime,current_timestamp)>=30
)
其他表也一样。
为了使其每天 运行 一次,使用 SQL Server Agent 创建一个作业。 将您的语句放在 T-SQL 步骤中,并安排每天一次。