SQL的关系演算
我正在尝试将以下关系演算转换为SQLSQL的关系演算,sql,Sql,我正在尝试将以下关系演算转换为SQL { a | ∃b X(a, b) ∧ ¬∃c ( Y(c) ∧ ¬X(a, c)) } 我知道这一定是一个大致的过程: SELECT X1.a FROM X X1 WHERE NOT EXISTS ( SELECT * FROM X, Y WHERE ... AND NOT ... ) 根据我的理解,它查看表X,对于其中的每个记录,它检查Y中的所有记录,因此Y中的每个记录都必须在X中,具有与我们检查时相同的属性值a 但我无法确
{ a | ∃b X(a, b) ∧ ¬∃c ( Y(c) ∧ ¬X(a, c)) }
我知道这一定是一个大致的过程:
SELECT X1.a
FROM X X1
WHERE NOT EXISTS
(
SELECT *
FROM X, Y
WHERE ... AND NOT ...
)
根据我的理解,它查看表X,对于其中的每个记录,它检查Y中的所有记录,因此Y中的每个记录都必须在X中,具有与我们检查时相同的属性值a
但我无法确切地理解如何将其转换为SQL
{ a | ∃b X(a, b) ∧ ¬∃c ( Y(c) ∧ ¬X(a, c)) }
编辑:
要用通俗易懂的英语更好地理解这一点:
让X
表示reservations
表,其中a
是personID
,b
是项
。设Y
为项的某个子集的表
表,而c
属性为项
据我所知,我们正在查看基于以下条件返回personID的情况:
对于reservations
中的每条记录,检查此人是否还保留了Y
中的所有其他项目,如果是这种情况,请将其返回
我可能错了,但这是我的理解
∃b X(a,b)
可能是这样吗
SELECT X.a
FROM X
WHERE X.b IS NOT NULL -- mean ( a, b ) are in X
或者延伸到类似的地方
SELECT X.a
FROM X
JOIN Q
ON X.b = Q.b
,∃c(Y(c)∧ -X(a,c))}
同样的想法
SELECT X.a
FROM X
WHERE c IS NULL -- mean ¬X(a, c)
所以
我发现这个问题实际上是一个除法运算,也就是说,如果我们把{2,1,4}集除以{4,1},我们得到{1,4}作为结果
因此,SQL将如下所示:
SELECT DISTINCT X1.a
FROM X X1
WHERE NOT EXISTS (
SELECT *
FROM Y
WHERE NOT EXISTS (
SELECT *
FROM X X2
WHERE (X2.a=X1.a) AND (X2.b=Y.c)
)
);
因此,当我们在数据集上运行它时:
R:
及
S:
我们应该期望把{1,2}找回来,因为他们是唯一的人
他们“从S借了所有项目”你能把关系演算放在英语上吗?好久不读了:P特别是|
我记得剩下的。@JuanCarlosOropeza我猜是这样的:{返回a |存在于X(a,b)中的b,不存在于c(在Y(c)中,而不存在于X(a,c,)}如果我要求你为你的表包含样本数据,这会是异端吗?@TimBiegeleisen我不确定样本数据表会有什么帮助。基本上,我的教授说任何关系演算(以上述形式)可以转换为SQL,并且这个过程是标准化的…但我似乎无法管理它:/。必须完善最后一步,但现在必须走。所以希望这能帮助您开始
x | y
----+----
1 | 1
2 | 1
2 | 2
2 | 3
1 | 2
3 | 1
4 | 3
c
----
1
2