簡體   English   中英

關系代數除了sql等價

[英]Relational Algebra Division sql equivalent

我無法理解關系代數除法的sql等價的翻譯。 我正在努力找到供應各個部分的供應商的sids。 在嵌套查詢中它是否基本上表明它正在“為所有供應商提供不提供每個部件”並且不存在? 但是,條件WHERE C1.sid = C.sid AND C1.pid = P.pid)也不是針對實際供應每個部分的供應商的sid嗎?

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)
                  )

在直接回答您的問題之前,讓我向您介紹如何翻譯查詢。 讓我們首先看一下外部子查詢:

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子句中的列實際上沒有任何意義。 我們基本上可以像下面這樣編寫查詢並且仍然傳達完全相同的含義,因此您不必擔心C1.sid在最內層查詢中的含義。

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嗎?

查看與主查詢相關的最內層查詢不是正確的方法。 這個最里面的查詢是為第一個子查詢選擇我們想要的部分。 此處選擇的供應商與上面*替換所示不相關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM