簡體   English   中英

關系代數相當於 SQL “NOT IN”

[英]Relational Algebra equivalent of 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

在關系代數中,您可以使用 Carthesian 乘積來完成此操作。 就像是:

R - ρ a1,a2a11,a21A11 = A22a11,a21 (R) x ρ a12, a22 (R))))

  • 將 R、fe 的列從 a1 重命名為 a11(左手)和 a12(右手)
  • 取 R 與重命名列的叉積
  • 選擇 a11 等於 a22 的行
  • 投影出 a12 和 a22 並保留 a11 和 a21
  • 重命名為 a1 和 a2

這為您提供了匹配的行。 從 R 中減去它以找到不匹配的行。

開頭的問題讓我們誤入歧途。 它應該是:

是否有等價於 SQL 表達式R WHERE ... [NOT] IN S的關系代數?

(也就是說,答案是兩個關系之間的某種操作,而不是某種過濾器。)

答案是肯定的,它是 (Natural) JOIN又名領結運算符

要了解原因,讓我們先整理一下給出的 SQL 解決方案。 如圖所示,它正在尋找屬性A1 NOT IN與單個屬性A2的關系。 這確實是屬性名稱的不匹配。 SQL 還允許NOT在 where 條件中。 這條SQL讓邏輯結構更清晰:

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

現在我們可以看到一個投影和一個重命名。 (根據第一個答案,我們可以將周圍的NOT實現為 set MINUS。)所以等效的 RA 是:

R - (R ⋈ ρ 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 (例如,這就是 Date & Darwen 在他們的A代數中所做的。)

對更一般問題的直接回答:

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

答案是:

R-R "bowtie" [R.A1=S.A2] ("pi" [A2] S )

暫無
暫無

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

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