下面是一个表和简单的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
.....
期待一些帮助
答案 0 :(得分: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