2012-09-22 114 views
5

是否存在與SQL表達式NOT IN等效的關係代數?關係代數等效SQL「NOT IN」

例如,如果我有關係:

A1 | A2 
---------- 
x | y 
a | b 
y | x 

我想刪除了其中A1是A2關係中的所有元組。在SQL我會質疑:

SELECT 
    * 
FROM 
    R 
WHERE 
    R.A1 NOT IN 
     (
     SELECT 
      A2 
     FROM 
      R 
     ) 
/

什麼是真的絆倒了我是怎樣的關係代數選擇運營商內部子查詢,這是可能的?:

σ一些子查詢這裏 [R

回答

6

在關係代數,你可以使用carthesian產品做到這一點。類似:

的R - ρ A1,A2(π A11,A21(σ A11 = A22(ρ A11,A21(R)Xρ A12,A22(R)) ))

  • 重命名R,fe從A1到A11(左)和A12(右手)
  • 採取的將R的交叉產品,重命名列
  • 其中A11等於A22
  • 項目出A12和A22,並選擇行保持A11和A21
  • 重命名爲a1和a2

這會爲您提供已匹配的行。從R中減去以找到不匹配的行。

+1

能否請您解釋一下這是如何工作...也許擴大省略號點。我無法理解交叉產品的結果,R中只有兩個字段,所以如何用兩個以上的參數將pi運算符放在它上面? – jsj

+0

如果只有兩列,可以省略省略號點。答案還使用了它應該使用RHO的PI,不知道是否在編輯或原始答案中。 – Andomar

+0

@Andomar:我也有關係代數問題。我已經發布了我的問題[這裏](http://stackoverflow.com/questions/18997845/how-to-convert-sql-to-relational-algebra-in-case-of-sql-joins)。你能幫我嗎?謝謝。 – 2013-09-29 00:25:57

2

最初的問題是讓我們錯誤地思考。它應該是:

是否存在與SQL表達式R WHERE ... [NOT] IN S等效的關係代數?

(也就是說,答案是兩次關係,某些類型的過濾器。之間的一些操作)

答案是肯定的,它是(自然科學)JOIN又名蝴蝶結運營商

要明白爲什麼,我們先來整理一下給出的SQL解決方案。如圖所示,它正在尋找屬性A1 NOT IN與單個屬性A2的關係。這實際上是屬性名稱中的錯誤匹配。 SQL還允許NOT在where條件內。這個SQL使得邏輯結構更清晰:

SELECT * FROM R 
WHERE NOT (A1 IN (SELECT A2 AS A1 FROM R)) 

現在我們可以看到一個投影和重命名。 (周圍的NOT我們可以按照第一個答案設置MINUS。)所以相當於RA爲:

R - (R ⋈ ρ A1/A2 A2(R)))

對於利息,教程d是:

R MINUS (R JOIN (R {A2} RENAME A2 AS A1)) 

在議題付諸表決的方式,有來自SQL思想的宿醉。 SQL的WHERE強制您進入行級「模式」。這是Codd反對的規則7要求一次性設置操作員。

通常,SQL的WHERE和RA的σ及其行級別的過濾器可以更簡潔地實現爲(自然)JOIN具有一次一次設置邏輯。 (例如,這是什麼日期&達爾文在其一個代數做。)