Relational-Division

寫SQL查詢相當於關係代數的關係除法?

  • January 19, 2022

這些是 3 個表的列表

EMPLOYEE (Ssn#, Fname, Lname, Bdate, Address, Sex, Salary, Super_ssn)

WORKS_ON (Essn#, Pno, Hours)

PROJECT (Pnumber#, Pname, Plocation)

問題一:編寫SQL查詢(相當於關係代數的關係除法),檢索所有員工貢獻的項目名稱

問題2:編寫SQL查詢(相當於關係代數的關係除法)來檢索每個項目工作的所有員工的名字和姓氏

然後有6個表的列表

ITEM (Item#, Item_Name, Unit_Price)

ORDER (Order#, Ord_Date, Cust#, Ord_Amt)

ORDER_ITEM (Order#, Item#, Qty)

WAREHOUSE (Warehouse#, Warehouse_City)

SHIPMENT (Order#, Warehouse#, Ship_Date)

WAREHOUSE_ITEM (Item#, Warehouse#, Qty)

問題3:編寫SQL查詢(相當於關係代數的關係除法)列出儲存在悉尼所有倉庫中的Item_Name和Quantity

這3道題都是作業題。但是,我已經嘗試並回答了它們,如下所示:

問題 1 的答案:

SELECT Pname 
FROM PROJECT
WHERE EXISTS (SELECT Pname 
             FROM PROJECT, EMPLOYEE 
             WHERE PROJECT.Pnumber = WORKS_ON.Pno);

問題 2 的答案:

SELECT Fname, Lname 
FROM EMPLOYEE
WHERE EXISTS (SELECT Fname, Lname 
                           FROM EMPLOYEE, WORKS_ON, PROJECT
                           WHERE EMPLOYEE.Ssn = WORKS_ON.Essn 
                             AND WORKS_ON.Pno = PROJECT.Pnumber);

問題 3 的答案:

SELECT Item_Name, Qty 
FROM ITEM, ORDER_ITEM
WHERE ITEM.Item# = ORDER_ITEM.Item#
 AND EXISTS(SELECT * 
            FROM WAREHOUSE 
            WHERE Warehouse_City = 'Sydney');

我只是想確認我對這 3 個問題的 SQL 查詢邏輯是否正確。

如果它是正確的,那麼我將能夠繼續並將它們轉換為具有關係除法的關係代數,如果我的 SQL 查詢邏輯正確,我可以自己完成。

如果不正確,請在適用的情況下更正我的 SQL 查詢邏輯中的錯誤,這對我非常有幫助。

第三個似乎是正確的。第一個和第二個讓我覺得錯了。您正在尋找任何員工做出貢獻的項目,而不是所有員工做出貢獻的項目。從本質上講,您是根據 ANY 而不是 ALL 標准進行劃分。

在這些情況下,您需要更改查詢以使用NOT EXISTS並查找不匹配項。

這是一篇簡短而簡潔的文章,描述了 SQL 中關係劃分的各種技術,其中有一個類似於您使用學生和課程而不是員工和項目的範例:http: //www.inf.usi.ch/faculty/soule/teaching /2016-fall/db/division.pdf

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