sql - 触发删除有两个条件

标签 sql sql-server database

这些是这个问题的相关表格:

Employee (EID, FirstName, LastName) - father
ConstructorEmployee (EID, CompanyName, SalaryPerDay) - son
Project (PID)
ProjectsConstructorEmployees (EID, PID, ...)

我想创建一个触发器,每当有人删除一个项目时,它都会从员工表中删除所有构造函数员工(以及级联,匹配的构造函数员工),它在删除的项目。

也就是说,如果员工1在项目1和2工作,员工2只在项目2工作,删除项目2后,员工2会被删除,而员工1不会。

这是我迄今为止尝试过的方法,但我遗漏了唯一的项目部分。

------- 1 -------
CREATE TRIGGER DeleteProject
AFTER DELETE 
ON Project 
AS
    DELETE FROM Employee
    WHERE E.EID == (SELECT EID 
                    FROM ConstructorEmployee as CE
                    WHERE CE.PID == (SELECT PID FROM deleted)) 
GO

提前致谢。

最佳答案

您需要将删除包装在 BEGIN/END block 中。

在您的触发器中,您可以使用 IN 比较运算符来包含一个返回要删除的员工 ID 列表的查询。

要构建 id 列表,您需要在表 ProjectsConstructorEmployees 中查找在该项目上工作的所有员工,然后使用相关查询过滤掉所有当前记录在另一个项目上的员工和一个 NOT EXIST 子句。

CREATE TRIGGER DeleteProject
AFTER DELETE ON Project AS
BEGIN
    DELETE
    FROM Employee
    WHERE E.EID IN (
        SELECT PCE.EID 
        FROM 
            DELETED DEL
            INNER JOIN ProjectsConstructorEmployees PCE ON PCE.PID = DEL.PID
        WHERE NOT EXISTS (
            SELECT 1 
            FROM ProjectsConstructorEmployees
            WHERE EID  = PCE.EID
            AND   PID != DEL.PID
        )
    )
END 

注意:为了使您的逻辑有意义,您必须在此之后添加另一个步骤,以无条件地从表 ProjectsConstructorEmployees 中删除所有与项目相关的记录。曾经在两个不同项目上工作过的其他员工永远不会离开。

DELETE FROM ProjectsConstructorEmployees WHERE PID = (SELECT PID FROM DELETED)

关于sql - 触发删除有两个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53900223/

相关文章:

mysql - 如何在 case 语句中创建循环

sql - DBCC 执行完成。如果 DBCC 打印出错误消息,请联系您的系统管理员

php - 将 SQL Server 日期时间转换为 MySQL 日期时间

java - 在 Realm 数据库中查询 : Find All Objects Containing Query String

c# - 如何在 .mdf 数据库上执行参数化选择查询并显示列值?

MySQL 和 hibernate : performance of left outer join vs multiple selects

mysql - 分组及订单

sql - REGEXP_REPLACE - 仅当包含在 () 中时才从字符串中删除新行\n

SQL:如何像 SELECT TOP @amount 中那样使用 TOP 参数?

database - 面向文档的数据库是否比关系型数据库更适合持久化对象?