Relational-Theory

關係代數題

  • December 27, 2011

這是給出的關係模式:

employee (person-name , street, city)
works (person-name, company-name, salary)
company (company-name, city)
manages (person-name, manager-name)

問:找出與他們的經理住在同一城市和同一條街道上的所有員工的姓名。

我在某處找到了解決方案:解決方案

但是解決方案似乎是錯誤的,即在第二個自然連接符號之後沒有選擇語句符號,並且就在該符號之後,出現了一個謂詞 0_o ,其中,該manager-name屬性來自哪裡?我完全迷路了。

自從我使用 Cartesian-product 以來,我的解決方案似乎很長,而且查詢有點長(我什至不確定它是對還是錯):(

免責聲明:從未學過關係代數,但看起來很有趣

根據給定的架構和您的問題,這就是 SQL 應該是什麼:

SELECT
   emp_mgr.person_name
FROM
   manages emp_mgr
   INNER JOIN employee emp ON emp_mgr.person_name  = emp.person_name
   INNER JOIN employee mgr ON emp_mgr.manager_name = mgr.person_name
WHERE
   emp.street = mgr.street AND
   emp.city = mgr.city
;

這是另一個只使用 JOIN,沒有 WHERE 子句的查詢:

SELECT
   emp.person_name
FROM
   (SELECT A.person_name,B.street,B.city FROM manages A
   INNER JOIN employee B ON A.person_name = B.person_name) emp
   NATURAL JOIN
   (SELECT A.manager_name,B.street,B.city FROM manages A
   INNER JOIN employee B ON A.manager_name = B.person_name) mgr
;

第一個查詢以笛卡爾積的形式獲取所有被管理的員工及其經理。然後,它尋找一條共同的街道和城市。

第二個查詢收集員工及其經理的人事記錄(姓名、街道、城市),並使用(街道、城市)在員工和經理之間執行 NATURAL JOIN。

如果您可以將這兩個查詢轉換回關係代數,我認為您將擁有您正在尋找的東西。我相信第二個可能會有更好的幫助。

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