msSQL多重删除多重连接
我想在条件为真时从多个表中删除多行。msSQL多重删除多重连接
我可以选择我想删除这个事情:
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包含工件(主键),TeilIO,开始,恩德和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
但是,当我更换SELECT *与删除我得到一个错误:“错误的语法旁边留有关键字”
我也试过
delete ProcessStepSt01,ProcessStepSt02,ProcessStepSt03
(select *后的所有内容都保持不变)
但是我得到“wrong sy ntax near','“
我想要的是删除ProcessStepSt01,ProcessStepSt02,ProcesStepSt03中工件与in(...)语句中的选择相匹配的所有行。
因此,这里是我的问题:
- 为什么我的语法不行?
- 我如何使它工作?
最后我想用
CREATE TRIGGER TRG_AutoRemove
ON workpieces
AFTER INSERT AS
BEGIN
...
END
定期 做到这一点,但我认为这样做与每个插入是有点矫枉过正(大约一个插入每两到三秒)。
有没有办法每小时/每天做一次?
请注意:我正在使用MSSQL。
感谢您的建议。
您不能同时从多个表中删除,您需要使用三个删除语句。但是,因为在这种情况下所有的表都有工件,所以这些陈述很容易。
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 Agent运行。
当然,如果其中一个ProcessStep表是主要的,并且没有它的其他记录不能存在(即,如果没有ProcessStepSt01,则记录不能存在于ProcessStepSt02或ProcessStepSt03中),那么您可以设置外部从02和03到01的关键关系,以级联方式删除。然后您只需从ProcessStepSt01中删除,其他记录将自动删除。
为了完整起见,如果你是想加入表中删除语句,你可以用这样的语法做:
DELETE PS1
FROM ProcessStepSt01 PS1
JOIN Workpieces W ON PS1.Workpiece = W.Workpiece
WHERE DATEDIFF(day, W.CreationTime, current_timestamp) >= 30
这将仍然只允许您从一个删除JOIN中的表,但它可以说比使用子查询更好一些,有时如果没有连接,你无法达到你所需要的。
好的,这里有很多东西。 首先:您不能同时从3个表中删除,您需要三个单独的语句。
delete
from ProcessStepSt01
where Workpiece
in (
select Workpiece from Workpieces
where datediff(day,workpieces.CreationTime,current_timestamp)>=30
)
与其他表相同。
使其每天运行一次使用SQL Server代理创建作业。 把你的陈述放在T-SQL步骤中,并且每天安排一次。