我有以下表格:
做了部门标识符,所以我们需要一些在employee.did但不在project.did中的东西
我想检索所有未通过截止日期的项目,并且其所有工作人员都属于不负责该项目的部门。
现在,我不知道如何检查 ddate 是否已结束(ddate 是截止日期,我不知道它是否已通过),以及如何在查询中表示它。
我将展示我到目前为止构建的查询:
SELECT Project.pname
from Project
FULL OUTER JOIN Employee
on Project.did <> Employee.did
AND ....
Run Code Online (Sandbox Code Playgroud)
(不知道如何检查 ddate 是否通过)是否有一个函数可以在 SQL 中显示日期进行比较(因此差异将是正的)或使用给定信息的任何技巧?
问题并不简单,因为它涉及 2 个实体/表(Employee
和Project
),它们之间有 2 个关系。一个是通过Department
(一个项目属于一个部门,一个员工属于一个部门),另一个是通过Onproject
(表明一个员工已经开始从事一个项目)。
此外,答案需要一个关系划分查询(“所有是工人属于......”)。有很多方法可以进行关系划分 - 并且都在不简单到非常复杂的范围内。
表达问题的一种方法是使用(双重)否定。与其寻找所有工人都不做某事的项目,不如找到所有工人都不做某事的项目。这可以用NOT EXISTS
子查询表示:
SELECT p.*
FROM Project AS p
WHERE p.ddate > CURRENT_DATE
AND NOT EXISTS
( SELECT *
FROM Employee AS e
JOIN Onproject AS w
ON w.eid = e.eid
WHERE w.pid = p.pid
AND e.did = p.did
) ;
Run Code Online (Sandbox Code Playgroud)
或与EXCEPT
:
SELECT p.*
FROM Project AS p
JOIN
( SELECT p.pid, p.did
FROM Project AS p
EXCEPT
SELECT w.pid, e.did
FROM Employee AS e
JOIN Onproject AS w
ON w.eid = e.eid
) AS pw
ON pw.pid = p.pid
WHERE p.ddate > CURRENT_DATE ;
Run Code Online (Sandbox Code Playgroud)
鉴于表定义,后者可以(简化?)使用NATURAL JOIN
:
SELECT *
FROM Project
NATURAL JOIN
( SELECT pid, did FROM Project
EXCEPT
SELECT pid, did FROM Employee NATURAL JOIN Onproject
) AS pw
WHERE ddate > CURRENT_DATE ;
Run Code Online (Sandbox Code Playgroud)