2

我正在使用一个数据库表,其中存储了一个 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 并不是我的强项。如果有人可以提供帮助,我将不胜感激!

4

1 回答 1

2

根据MySQL 手册

目前,您不能在子查询中从表中删除并从同一个表中选择。

为了解决这个问题,您可以使用临时表,将相关行插入到临时表中,然后在删除语句中引用它。

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
        )

SQL Fiddle 示例

于 2012-11-12T17:25:57.467 回答