关系代数 - 找到两个完全正确的值

时间:2014-08-24 16:15:47

标签: sql database relational relational-algebra relational-division

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

Name     State
----     -----
Paris    MO
Paris    TX
Paris    VA
Austin   MA
Austin   TX
Burling  VT

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

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);

我想在关系代数中表达上面的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
.....

期待一些帮助

2 个答案:

答案 0 :(得分:3)

我给你一个提示:

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

  • 在州内发生2次和2次以上的城市
  • 在一个州发生3次和3次以上的城市

这样:

状态下的两次可以计算为:

2,在状态下超过2次,除 3以外,状态超过3次。

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

要注意此运算符的非传递性&lt;&gt;当你做3个或更多的测试!!!

我希望你能解决这个问题!这非常重要!祝你好运

答案 1 :(得分:-1)

我会首先考虑GROUP BY和HAVING:

select city, count(state) 
from city 
group by city
having count(state) = 2
order by city