关系演算到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。

编辑:

为了用通俗易懂的英语更好地理解这一点:设X表示reservations表,其中apersonIDbitem。设Yitems表的某个子集的表,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

最新更新