Select
需要sql來表示關係否定和日期比較問題
我有以下表格:
- 員工(開齋節,姓名,薪水,做過,分類)
- 項目(pid、pname、did、budget、ddate)
- 部門(did,dname,floor,head)
- dbudget(做了,兩年,預算)
- 項目(pid、pname、did、budget、ddate)
- Onproject(pid,eid,fdate)
did 部門標識符,所以我們需要一些在 employee.did 但不在 project.did 上的東西
並且我想檢索所有未通過截止日期的項目,並且其所有工作人員都屬於不負責該項目的部門。
現在,我不知道如何檢查 ddate 是否結束(ddate 是截止日期,我不知道它是否已通過),以及如何在查詢中表示它。
我將展示到目前為止我建構的查詢:
SELECT Project.pname from Project FULL OUTER JOIN Employee on Project.did <> Employee.did AND ....
(不知道如何檢查 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 ) ;
或與
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 ;
給定表格定義,後者可以(簡化?)使用
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 ;