[英]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,a2 (π a11,a21 (σ A11 = A22 (ρ a11,a21 (R) x ρ a12, a22 (R))))
這為您提供了匹配的行。 從 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.