2014-01-27 50 views
0

工作,如果我有两个表如何左联接和右联接在关系代数

CREATE TABLE R 
(
a int, 
b int 
); 

CREATE TABLE S 
(
b int, 
c int, 
d int 
); 

INSERT INTO R 
VALUES (3,1),(2,3),(2,0),(3,3),(1,1); 

INSERT INTO S 
VALUES (2,2,3),(3,0,0),(1,3,3),(2,2,0); 

然后我做R outer join S。我试图找出结果。如果我尝试使用SQL代码,我会做:

SELECT r.a,r.b,s.c,s.d 
    FROM R r 
    LEFT JOIN S s ON r.b=s.b 

    UNION 

    SELECT r.a,r.b,s.c,s.d 
    FROM R r 
    RIGHT JOIN S s ON r.b=s.b 

该查询的结果是:

A B C D 
3 1 3 3 
2 3 0 0 
2 0 - - 
3 3 0 0 
1 1 3 3 
- - 2 3 
- - 2 0 

如果我试图用手工来解决它:

3 1两胜1 3 3

3 0 0

2 3比赛场

2 0比赛用- - -

3 3比赛用3 0 0

1 1比赛用1 3 3

这使得上述在该结果的第一5行。剩下的两行来自正确的连接。但我不明白的是,为什么正确的连接生成

- - 2 3 
- - 2 0 

因为左侧加入2 0不匹配任何东西,然而b柱保留和0在那里。

但在右侧加入,2 2 32 2 0与任何内容都不匹配,但b列变为空。不应该像在左连接一样保存b列吗?

任何人都可以解释这是怎么回事吗?

谢谢。

回答

0

它是因为你要求r.b不存在。改用s.b。例如

SELECT r.a,r.b,s.c,s.d 
    FROM R r 
    LEFT JOIN S s ON r.b=s.b 

    UNION 

    SELECT r.a,s.b,s.c,s.d 
    FROM R r 
    RIGHT JOIN S s ON r.b=s.b 
+0

但是在关系代数(不是sql)中,它是选择'r.b'还是's.b'? – omega

0

,在你的RiGHT JOIN查询你,你得到了

- - 2 3 
- - 2 0 

记录的原因是因为当你特别要求它。
当你执行一个正确的加入时,你需要从右边的参数表(S)中的所有记录,以及左边参数表中的匹配行(在你的情况下为R)。如果不存在这样的匹配,则左边的记录将被空值替换。

看看this SO线程。

+0

但是在关系代数中,如果你只是做了'R outer join S',结果将如何? (你如何选择它的r.b或s.b)? – omega

+0

@Omega结果将会是'LEFT'和'RIGHT''JOINS'的结合。非常像你的查询。这些行是联合中的'RIGHT JOIN'部分。 –

+0

但是在一个正确的连接中,我可以选择s.b或r.b,我碰巧选择了r.b,它给出了一个null,如果我把s.b它不会为null。这两种方法都适用于sql,但我不明白在关系代数中使用哪一种方法... – omega

0

要回答欧米茄的问题有关外连接:

在RA严格地说,有没有这样的事情外连接。因为你必须在结果中填入'缺少'属性的空值。

但是,如果您坚持,请在'全外连接'上转到http://en.wikipedia.org/wiki/Relational_algebra。在所有不匹配的属性下,有一张图片显示了不同的空值。

现在,您必须涉及所有可能为null值的机器,以及如何处理提及它们的选择。你只是不需要头痛。