SQL的关系演算

SQL的关系演算,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 但我无法确

我正在尝试将以下关系演算转换为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

{ 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