【发布时间】:2014-08-24 16:15:47
【问题描述】:
下面是一个表格和简单的 SQL,用于查找恰好出现在两个州的城市
Name State
---- -----
Paris MO
Paris TX
Paris VA
Austin MA
Austin TX
Burling VT
结果:只有奥斯汀才有资格,因为它恰好出现在两个州
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
.....
期待帮助
【问题讨论】:
-
X4 = X3 J (... c3 ...) AND x4 IS EMPTY(is_empty必须有运算符) -
您在不存在的情况下的简单连接告诉您在至少 2 个州中找到的城市。沿着类似的路线进行额外的连接将为您提供至少在三个州中找到的城市。然后你只需要从第一组中减去它。
-
关系代数不止一种。给一个你要使用的链接。
-
@wildplasser 没有 is_empty 也没有办法表达它,假设标准运算符集仍然可以表达任何查询。 (X、U、-、项目、重命名和限制只能提及参数的属性。)假设表 R 别名为 R 包含其中 R(R.x,...) 的行。然后 T WHERE EXISTS(U WHERE ...T.a...U.b...) = T(T.a,...) & 存在 U.b,... [U(U.b,...) & ...T.a.. .U.b...] = 存在 U.b,...的行 [T(T.a,...) & U(U.b,...) & ...T.a...U.b...] = 项目 T.a,... (限制...T.a...U.b...(T X U))。 (稍后 SELECT R.x AS y,... ... 给出重命名 R.x\y,... (project R.x,... (...))。)
标签: sql database relational relational-algebra relational-division