1

松弛连接运算符定义为:

如果关系 R 和 S 的自然连接非空,则返回此连接的结果;否则,返回 R 和 S 的笛卡尔积。

问题是编写一个关系代数和 SQL 来返回两个关系的relax-join,但不使用 IF-THEN-ELSE。

4

3 回答 3

1

由于这被标记为作业,我想我只应该提供指导。

这里有一些要考虑的事情:

  1. 联合将允许您组合两个查询 A 和 B 的结果。A、B 或两者是否包含记录都没有关系。

  2. 交叉连接和自然连接将产生相同的结果列。更新 正如@ypercube 指出的那样,这不是真的。MYSQL您可以编写您的 sql,以便它们返回相同的列,因此可以在联合中使用两者。这可能适合您,也可能不适合您。

  3. 鉴于您的情况,如果您要返回记录,则交叉连接将始终生成记录。自然连接可能会也可能不会。

我希望这不是太多的暗示,很难判断我是否透露太多或不够。当你弄清楚时告诉我们!

更新

我不知道在 x 时间后我们应该发布实际答案,但这是我暗示的伪查询:

SELECT * 
FROM R
CROSS JOIN S
WHERE NOT EXISTS (
    SELECT *
    FROM R
    NATURAL JOIN S
)

UNION

SELECT *
FROM R
NATURAL JOIN S
于 2012-02-20T01:00:03.980 回答
1

因为这是一个涉及关系的运算符,所以可以假设结果也必须是 SQL 中可能的关系,即不重复列、不重复行、不空值等。顺便说一句,请注意,如果没有关系R并且S是共同的,那么它们的自然连接将产生与它们的乘积相同的结果。

正如已经指出的,如果RS有一些共同的属性(相同的名称,相同的类型),那么在 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 );
于 2012-02-21T14:43:39.980 回答
0

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)
于 2012-02-21T13:56:17.697 回答