0
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”附近有语法错误会出现什么问题?第一个选择所有项目中的工人作品。第二个选择工人不在任何项目中工作。提前致谢

表是

工人 = {Name, Surname, Id, Salary, DptNum}

部门 = {DptName, DptNumber}

Works_at = {WorkerId,PNum,小时}

Project={PName, PNumber, DptNum} 和

Works_at(WorkerId) → Worker(Id)

Works_at(Pnum) → Projekt(PNumber)

项目(DptNum) → 部门(DptNumber)

工人(DptNum) → 部门(DptNumber)

4

2 回答 2

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

这应该为您提供与项目无关的人员列表。这是基于有可能在地点工作,但没有分配项目。如果桌子上的作品没有记录,那么它会更简单

SELECT 
      W.Surname
   FROM 
      Worker W
         LEFT JOIN Works_At WA
            on W.ID = WA.WorkerID
   WHERE
      WA.WorkerID IS NULL
于 2012-12-04T19:05:52.980 回答
1

您无法访问 Works_at.PNum = Project.PNumber,因为项目表不适用于该子查询。

于 2012-12-04T19:07:46.210 回答