SELECT Surname
FROM Worker
WHERE NOT EXISTS
(
SELECT *
FROM Project, Works_at
WHERE NOT EXISTS
(
SELECT *
FROM Works_at
WHERE Works_at.WorkerId =Worker.Id
AND Works_at.PNum = Project.PNumber
)
);
或
SELECT Surname
FROM Worker
WHERE NOT EXISTS (
SELECT *
FROM Works_at
WHERE Id = WorkerId
);
当我运行查询时,它表示在" SELECT"附近有语法错误。 什么可能出错? 第一个选择所有项目中的工人工作。 第二个选择工人在任何项目中都不起作用。 提前致谢
表是
工人= {名字,姓氏,身份证,薪水,DptNum}
部门= {DptName,DptNumber}
Works_at = {WorkerId,PNum,Hours}
Project = {PName,PNumber,DptNum}和
Works_at(WorkerId)→工人(Id)
Works_at(PNum)→Projekt(PNumber)
项目(DptNum)→部门(DptNumber)
工人(DptNum)→部门(DptNumber)
答案 0 :(得分:2)
NOT IN子选择对性能很糟糕。你最好使用LEFT-JOIN并测试NULL(即:没有匹配)
SELECT
W.Surname
FROM
Worker W
LEFT JOIN Works_At WA
on W.ID = WA.WorkerID
LEFT JOIN Project P
on WA.PNum = P.PNumber
WHERE
P.PNumber IS NULL
这应该会为您提供与项目无关联的人员列表。这是基于Works At位置的可能性,但没有分配项目。如果在桌上的作品中没有记录,那么使用
会更简单SELECT
W.Surname
FROM
Worker W
LEFT JOIN Works_At WA
on W.ID = WA.WorkerID
WHERE
WA.WorkerID IS NULL
答案 1 :(得分:1)
您无法访问Works_at.PNum = Project.PNumber,因为该子查询无法使用项目表。