这些是这个问题的相关表格:
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/