Select

需要sql來表示關係否定和日期比較問題

  • December 6, 2017

我有以下表格:

  • 員工(開齋節,姓名,薪水,做過,分類)
  • 項目(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 個實體/表(EmployeeProject),它們之間有 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 ;

引用自:https://dba.stackexchange.com/questions/192518