松弛连接运算符定义为:
如果关系 R 和 S 的自然连接非空,则返回此连接的结果;否则,返回 R 和 S 的笛卡尔积。
问题是编写一个关系代数和 SQL 来返回两个关系的relax-join,但不使用 IF-THEN-ELSE。
松弛连接运算符定义为:
如果关系 R 和 S 的自然连接非空,则返回此连接的结果;否则,返回 R 和 S 的笛卡尔积。
问题是编写一个关系代数和 SQL 来返回两个关系的relax-join,但不使用 IF-THEN-ELSE。
由于这被标记为作业,我想我只应该提供指导。
这里有一些要考虑的事情:
联合将允许您组合两个查询 A 和 B 的结果。A、B 或两者是否包含记录都没有关系。
交叉连接和自然连接将产生相同的结果列。更新 正如@ypercube 指出的那样,这不是真的。MYSQL
您可以编写您的 sql,以便它们返回相同的列,因此可以在联合中使用两者。这可能适合您,也可能不适合您。
鉴于您的情况,如果您要返回记录,则交叉连接将始终生成记录。自然连接可能会也可能不会。
我希望这不是太多的暗示,很难判断我是否透露太多或不够。当你弄清楚时告诉我们!
更新
我不知道在 x 时间后我们应该发布实际答案,但这是我暗示的伪查询:
SELECT *
FROM R
CROSS JOIN S
WHERE NOT EXISTS (
SELECT *
FROM R
NATURAL JOIN S
)
UNION
SELECT *
FROM R
NATURAL JOIN S
因为这是一个涉及关系的运算符,所以可以假设结果也必须是 SQL 中可能的关系,即不重复列、不重复行、不空值等。顺便说一句,请注意,如果没有关系R
并且S
是共同的,那么它们的自然连接将产生与它们的乘积相同的结果。
正如已经指出的,如果R
和S
有一些共同的属性(相同的名称,相同的类型),那么在 SQL 中,表的乘积将产生重复的列。忽略查询的想法INFORMATION_SCHEMA
,relax-join 不能在 SQL 中泛化。相反,我们必须使用显式投影,即SELECT
具有显式属性的子句,至少其中一些必须是“点限定”的。比如说我们有R { x, y }
一个通用列S { y, z }
,y
那么产品可以表示为:
SELECT DISTINCT R.x, R.y, S.z
FROM R CROSS JOIN S
即所有属性的投影R
和已知的属性S
不通用。有许多其他可能性会产生相同的结果,但都涉及所涉及属性的先验知识,包括是否有任何共同点。
接受了投影必须是显式的,通过将自然连接表示为它的 theta 连接等价物,即[INNER] JOIN
使用一个ON
子句,什么都不会丢失:
SELECT DISTINCT R.x, R.y, S.z
FROM R JOIN S ON R.y = S.y
同样,我们不需要 SQL 关键字CORRESPONDING
(如UNION CORRESPONDING
)。令人高兴的是,这一切都意味着我的查询都将在我选择的 SQL 产品(SQL Server)上运行!
我认为 J Cooper 暗示的一种方法是 a) 自然连接(可能是空集)和 b) 自然连接是空集的乘积:
SELECT R.*, S.z
FROM R JOIN S ON R.y = S.y
UNION
SELECT R.*, S.z
FROM R CROSS JOIN S
WHERE NOT EXISTS ( SELECT *
FROM R JOIN S ON R.y = S.y );
另一种方法是乘积减去自然连接不是空集的对称差(“互斥元组”):
SELECT R.*, S.z
FROM R CROSS JOIN S
EXCEPT
SELECT R.*, S.z
FROM R JOIN S ON R.y <> S.y
WHERE EXISTS ( SELECT *
FROM R JOIN S ON R.y = S.y );
SQL:
R1 = A equi_join B
R2 = A X B
R1
U
R2 not exists R1
这是对此的答案。
由于作业截止日期已经结束:
R1 = A equi_join B
R2 = A X B
R3 = R2.* (R1 X R2)
R4 = R2 - R3
return (R1 U R4)