关系代数 - 精确查找两个值

rub*_*ube 3 sql database relational relational-algebra relational-division

下面是一个表和简单的 SQL,用于查找恰好出现在两个州的城市

Name     State
----     -----
Paris    MO
Paris    TX
Paris    VA
Austin   MA
Austin   TX
Burling  VT
Run Code Online (Sandbox Code Playgroud)

结果:只有奥斯汀才有资格,因为它恰好发生在两个州

SQL

SELECT c1.Name FROM City AS c1
JOIN City AS c2 ON c1.Name = c2.Name AND c1.State <> c2.State
WHERE NOT EXISTS (
    SELECT 1 FROM City AS c3
    WHERE c1.Name = c3.Name AND c3.State NOT IN (c1.State, c2.State);
Run Code Online (Sandbox Code Playgroud)

我想用关系代数来表达上面的sql。我做了第一部分,它找到了至少在两个州中出现的城市,但无法弄清楚如何表达 NOT EXISTS (...) 部分。我的理解是,我需要在后面的部分中进行一些关系划分。

关系代数(第一部分)

P = 用于重命名的 rho 符号,J = 加入

X1 --> Pc1(City)
X2 --> Pc2(City)
X3 --> X1 J ( c1.Name = c2.Name AND c1.State <> c2.State ) X2
.....
Run Code Online (Sandbox Code Playgroud)

期待一些帮助

小智 5

我给你一个提示:

没有聚合函数,您可以找到:

  • 在一个州出现 2 次或 2 次以上的城市
  • 在一个州出现 3 次或 3 次以上的城市

所以:

某个状态的两次可以计算为:

2次及2次以上的状态除外, 3次及3次以上的状态除外。

所以你需要制作2份表格并计算2个以上州的城镇,然后制作3份并计算3个或更多州的城镇......

当您进行 3 个或更多测试时,请注意此运算符 <> 的非传递性!

我希望你能完成这个练习!这真的很重要!祝你好运