2015-11-20 43 views
3

我無法理解關係代數分解的sql等價物的翻譯。我試圖找到供應每個零件的供應商的標準。在嵌套查詢中,它基本上表明它正在尋找「供應所有不提供每個零件的供應商」並且不存在? 但條件WHERE C1.sid = C.sid AND C1.pid = P.pid)也不是針對實際供應每個零件的供應商的sid嗎?關係代數分區sql相當於

Suppliers(sid: integer, sname: string, address: string) 
Parts(pid: integer, pname: string, color: string) 
Catalog(sid: integer, pid: integer, cost: real) 

SQL翻譯

SELECT C.sid 
FROM Catalog C 
WHERE NOT EXISTS (SELECT P.pid 
        FROM Parts P 
        WHERE NOT EXISTS (SELECT C1.sid 
            FROM Catalog C1 
            WHERE C1.sid = C.sid 
            AND C1.pid = P.pid) 
       ) 

回答

2

之前直接回答你的問題,讓我帶你通過你應該如何對待翻譯查詢。讓我們來看看外子查詢作爲一個整體第一:

SELECT P.pid 
FROM Parts P 
WHERE NOT EXISTS (
    SELECT C1.sid 
    FROM Catalog C1 
    WHERE C1.sid = C.sid 
    AND C1.pid = P.pid) 

這個片段被「不受C.sid提供的部分」。請注意,子查詢中select子句中的列實際上沒有任何意義。我們基本上可以像下面那樣編寫查詢,並且仍然傳達完全相同的含義,因此您不必擔心在最內層查詢中的含義。

SELECT P.pid 
FROM Parts P 
WHERE NOT EXISTS (
    SELECT * 
    FROM Catalog C1 
    WHERE C1.sid = C.sid 
    AND C1.pid = P.pid) 
與主查詢

現在參與

SELECT C.sid 
FROM Catalog C 
WHERE NOT EXISTS (SELECT * 
        FROM Parts P 
        WHERE NOT EXISTS (SELECT * 
            FROM Catalog C1 
            WHERE C1.sid = C.sid 
            AND C1.pid = P.pid) 
       ) 

這意味着我們想要的供應商(C.sid),用於其不存在「沒有被他們所提供的零部件(C.sid )「(注意我從上面的段落中複製了子查詢的翻譯)。這基本上意味着我們需要供應每個零件的供應商。

現在回到你兩個問題:

在嵌套查詢它本質上說,它是尋找「爲 誰不提供各部分的所有供應商」,做一個不存在的?

不,請看上面的解釋。

但不會WHERE C1.sid = C.sid AND C1.pid = P.pid) 還針對供應商的SID的狀況究竟是誰提供每一個部分?

這不是查看與主查詢相關的最內層查詢的正確方法。最內層的查詢在第一個子查詢中選擇我們想要的部分。這裏選擇的供應商與上面的替代*不相關。

+0

似乎有雙重否定發生。爲什麼不只是改變所有的不存在存在? 實施例: SELECT C.sid FROM目錄Ç 凡存在(SELECT * FROM 零件P WHERE EXISTS(SELECT * FROM 目錄C1 WHERE C1.sid = C.sid AND C1.pid = P.pid ) – Sam

+1

這是不一樣的,這意味着只提供至少一個零件的供應商。不存在兩次並不總是意味着雙重否定,因爲您正在將它們做成不同的表/列。 您是否嘗試用基本的關係代數運算(投影,選擇,差異,笛卡爾乘積,重命名)重寫C÷P?你會看到結果有兩個不同的運算符。您不能將兩個不同的運算符合併爲一個或零。這相當於您不能摺疊兩個連續的非存在查詢。 – KangarooWest