2017-02-23 71 views
0

我想在条件为真时从多个表中删除多行。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(...)语句中的选择相匹配的所有行。

因此,这里是我的问题:

  1. 为什么我的语法不行?
  2. 我如何使它工作?

最后我想用

CREATE TRIGGER TRG_AutoRemove 
ON workpieces 
AFTER INSERT AS 
BEGIN 
... 
END 

定期 做到这一点,但我认为这样做与每个插入是有点矫枉过正(大约一个插入每两到三秒)。

有没有办法每小时/每天做一次?

请注意:我正在使用MSSQL。

感谢您的建议。

回答

0

您不能同时从多个表中删除,您需要使用三个删除语句。但是,因为在这种情况下所有的表都有工件,所以这些陈述很容易。

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中的表,但它可以说比使用子查询更好一些,有时如果没有连接,你无法达到你所需要的。

0

好的,这里有很多东西。 首先:您不能同时从3个表中删除,您需要三个单独的语句。

delete 
from ProcessStepSt01 
where Workpiece 
in (
    select Workpiece from Workpieces 
    where datediff(day,workpieces.CreationTime,current_timestamp)>=30 
) 

与其他表相同。

使其每天运行一次使用SQL Server代理创建作业。 把你的陈述放在T-SQL步骤中,并且每天安排一次。