我正在使用一个数据库表,其中包含一个AssociateID字段和一个DocumentName字段。该表用于记录哪些员工缺少哪些文件。
我正在尝试编写一个存储过程,如果找不到同一个员工的“终止声明”条目,则会删除“限制性契约书”的行。以下是我到目前为止的内容:
DELETE from tbl_HR_Auditing_Reports
WHERE DocumentName = 'Restrictive Covenant Letters'
AND NOT EXISTS
(
SELECT TS.AssociateID
FROM
(SELECT AssociateID FROM tbl_HR_Auditing_Reports WHERE DocumentName = 'Termination Statement (*)') TS,
(SELECT AssociateID FROM tbl_HR_Auditing_Reports WHERE DocumentName = 'Restrictive Covenant Letters') RCL
WHERE TS.AssociateID = RCL.AssociateID
)
我认为我很接近,但是sql并不是我的强项。如果有人可以提供帮助,我会非常感激!
答案 0 :(得分:2)
根据MySQL manual:
目前,您无法从表中删除并从子查询中的同一个表中进行选择。
要解决此问题,您可以使用临时表,将相关行插入临时表,然后在delete语句中引用它。
CREATE TEMPORARY TABLE tmp (AssociateID INT);
INSERT INTO tmp (AssociateID)
SELECT AssociateID
FROM tbl_HR_Auditing_Reports
WHERE DocumentName = 'Termination Statement (*)';
DELETE
FROM tbl_HR_Auditing_Reports
WHERE DocumentName = 'Restrictive Covenant Letters'
AND NOT EXISTS
( SELECT 1
FROM tmp
WHERE tmp.AssociateID = tbl_HR_Auditing_Reports.AssociateID
)
<强> Example on SQL Fiddle 强>