需要sql来表示关系否定和日期比较问题

Beg*_*ath 0 select dbms

我有以下表格:

  • 员工(eid,ename,salary,did,classification)
  • 项目(pid,pname,did,budget,ddate)
  • 部门(did,dname,floor,head)
  • dbudget(did,byear,budget)
  • 项目(pid,pname,did,budget,ddate)
  • Onproject(pid,eid,fdate)

做了部门标识符,所以我们需要一些在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 中显示日期进行比较(因此差异将是正的)或使用给定信息的任何技巧?

ype*_*eᵀᴹ 6

问题并不简单,因为它涉及 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
      ) ;
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)