当没有共同属性时,关系代数中的LEFT OUTER JOIN究竟是如何工作的?

时间:2012-02-03 16:38:32

标签: sql relational-algebra

例如,假设我们有两个关系

R1(A,B) R2(C,d)

这些也是表格

  A B
 a1 b1 
 a2 b2

 C  D
 c1 d1
 c2 d2

左外连接结果是下表吗?

  A   B  C  D 
  a1 b1 c1 d1
  a1 b1 c2 d2
  a2 b2 c1 d1
  a2 b2 c2 d2

我们没有共同的属性,这就是为什么我不包含任何NULL。

如果此结果是正确的,则它与简单连接和交叉连接运算符基本相同 我错了吗?

2 个答案:

答案 0 :(得分:1)

LEFT OUTER JOIN 始终在某个公共列上完成。对于您的示例CROSS JOIN是唯一适用的例子,它会准确地为您提供结果。

来自Rebeca M. Riordan: Designing Relational Database Systems, published by Microsoft Press

Excrept(第5章,关系代数):

  

外部联接返回内部联接返回的所有记录   来自其他记录集中的一个或两个的所有记录。该   缺少(“不匹配”)值将为Null。

答案 1 :(得分:1)

没有条件的

r1 LEFT JOIN r2相当于r1 LEFT JOIN r2 ON (Empty)=(Empty)。但是,我不认为您可以在SQL中r1 LEFT JOIN r2发出ON部分。

您可以做的是发出r1 NATURAL LEFT JOIN r2(至少在MySQL中):

CREATE TABLE R1
( a int
, b int
) ;

INSERT INTO R1
  VALUES
  (1,1) ,
  (2,2) ;


CREATE TABLE R2
( c int
, d int
) ;

INSERT INTO R2
  VALUES
  (3,3) ,
  (4,4) ;

SELECT
      *
FROM 
      R1
  NATURAL LEFT JOIN 
      R2 ;

结果(正确)与NATURAL INNER JOINCROSS JOIN相同:

a b c d
-------
1 1 3 3
1 1 4 4
2 2 3 3
2 2 4 4