SQL在三个表中选择语法错误

时间:2012-12-04 18:59:44

标签: sql select syntax-error

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)

2 个答案:

答案 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,因为该子查询无法使用项目表。