我正在尝试将以下关系演算转换为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
值。
但我不知道如何将其转换为SQL。
编辑:
为了用通俗易懂的英语更好地理解这一点:设X
表示reservations
表,其中a
是personID
,b
是item
。设Y
是items
表的某个子集的表,c
属性为item
。
据我所知,我们正在研究基于以下条件返回personID
的情况:
对于reservations
中的每条记录,检查此人是否还保留了Y
中的所有其他item
,如果是,则将其返回。
我可能错了,但这是我对此的理解。
∃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
(Y(c)∧-X(a,c))}
相同的想法
SELECT X.a
FROM X
WHERE c IS NULL -- mean ¬X(a, c)
所以
NOT EXISTS ( SELECT 1
FROM Y
JOIN X
ON X.c = Y.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:
x | y
----+----
1 | 1
2 | 1
2 | 2
2 | 3
1 | 2
3 | 1
4 | 3
和
S:
c
----
1
2
我们应该期待{1,2}的归还,因为这些是唯一一个"从S借来所有物品"的persons
。