我正在阅读一本教科书上的关系代数。
我碰到除法运算 http://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29。来自维基百科:
除法是一个二元运算,写为 R ÷ S。结果由 R 中的元组对 R 特有的属性名称的限制组成,即在 R 的标头中但不在 S 的标头中,为此它认为它们与 S 中元组的所有组合都存在于 R 中。
因此,如果 R 是:
+----+----+
| A | B |
+----+----+
| a1 | b1 |
| a2 | b1 |
| a3 | b1 |
| a4 | b1 |
| a1 | b2 |
| a3 | b2 |
| a2 | b3 |
| a3 | b3 |
| a4 | b3 |
| a1 | b4 |
| a2 | b4 |
| a3 | b4 |
+----+----+
且 S 为:
+----+
| A |
+----+
| a1 |
| a2 |
| a3 |
+----+
那么输出应该是:
+----+
| B |
+----+
| b1 |
| b4 |
+----+
现在,本书给出了计算 DIVIDE 运算的关系等效步骤,如下所示。
我试图在 SQL Server 中完全模仿它,但方向不对
T1 ← πBR //that is SELECT A FROM R
T2 ← πB((S x T1) - R) //SxT1 can simply be done as SELECT * FROM S,T1
T ← T1 - T2
你的公式不准确。在您的特定情况下,您需要投影B
而不是投影A
否则如何B
属性会出现在结果中吗?
T1 ← πBR
T2 ← πB((S x T1) - R)
T ← T1 - T2
查询:
-- T ← T1 - T2 -------------------------------------
SELECT DISTINCT B FROM R -- T1 ← πBR --
WHERE B NOT IN ( --
-- T2 ← πB((S x T1) - R) ------------------- --
SELECT CR.B -- --
FROM ( -- --
-- (S x T1) -------------------- -- --
SELECT S.A, R2.B -- -- --
FROM S -- -- --
CROSS JOIN ( -- -- --
-- T1 ← πBR -- -- --
SELECT DISTINCT B FROM R -- -- --
) AS R2 -- -- --
-------------------------------- -- --
) AS CR -- --
WHERE NOT EXISTS ( -- --
SELECT * -- --
FROM R -- --
WHERE R.A = CR.A AND R.B = CR.B -- --
)------------------------------------------- --
)---------------------------------------------------
结果:
B
--
b1
b4
SQL小提琴 http://sqlfiddle.com/#!3/7251e/1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)