1

我不明白为什么右外连接(下面的例子)没有像左外连接那样给出表的完整数据集;因为外连接总是保留对应表的行。

创建表

create table join_test
(id number unique not null, name varchar2(10), department varchar2(10));

填充表

select * from join_test;

   ID NAME            DEPARTMENT   
    1 stelios          sa 
    2 andros           sa 
    3 stav             ba  
    4 mary             ba  
    5 antonia          la  
    6 lambros          ka  

内部联接

select j1.name, j1.department
from join_test j1 join join_test j2
on(j1.department=j2.department and j1.name<>j2.name);

   NAME         DEPARTMENT
   andros          sa
   steliso         sa
   mary            ba
   stav            ba

左外连接

select j1.name, j1.department
from join_test j1 left join join_test j2
on(j1.department=j2.department and j1.name<>j2.name)

   NAME       DEPARTMENT
   andros     sa
   steliso    sa
   mary       ba
   stav       ba
   antonia    la
   lambros    ka

右外连接

select j1.name, j1.department
from join_test j1 right join join_test j2
on(j1.department=j2.department and j1.name<>j2.name)

   NAME       DEPARTMENT
   steliso    sa
   andros     sa
   stav       ba
   mary       ba

将选择列表更改为 j2

select j2.name, j2.department
from join_test j1 right join join_test j2
on(j1.department=j2.department and j1.name<>j2.name)

 NAME       DEPARTMENT
 andros     sa
 steliso    sa
 mary       ba
 stav       ba
 antonia    la
 lambros    ka
4

3 回答 3

2

这会在 SQL Fiddle (sqlfiddle.com/#!4/1e7075/2) 中产生正确的结果。不过,我有一个怀疑。返回的结果是:

NAME    DEPARTMENT
stelios sa
andros  sa
stav    ba
mary    ba
(null)  (null)
(null)  (null)

我怀疑无论您返回结果(或查看结果)如何,具有所有NULL值的行都将被忽略。尝试从表中选择列j2,看看是否能得到更多结果。

于 2014-02-11T16:01:35.607 回答
1

右连接和左连接执行相同的功能。您的示例中的不同之处在于您从中选择的表。

这两个查询:

select j2.name,j2.department
from join_test j1 left join join_test j2
on(j1.department=j2.department and j1.name<>j2.name)

select j1.name,j1.department
from join_test j1 right join join_test j2
on(j1.department=j2.department and j1.name<>j2.name)

产生相同的结果:

NAME    DEPARTMENT
stelios sa
andros  sa
stav    ba
mary    ba
(null)  (null)
(null)  (null)

您在左右查询之间看到的结果不同的原因是,在左侧示例中,您正在从“驱动”表(左侧表 J1)中进行选择。连接显示驱动表 (J1) 中的所有行,以及右侧或非驱动表 (J2) 中的匹配行(未显示)。

在您的正确示例中,您正在更改联接,但仍从 J1 中进行选择。由于 J1 现在是非驱动表,因此您只能看到来自 J1 的匹配结果。如果将 J2 列添加到选择中,您将看到它的所有行:

NAME        DEPARTMENT   NAME       DEPT
stelios     sa           andros     sa
andros      sa           stelios    sa
stav        ba           mary       ba
mary        ba           stav       ba
(null)      (null)       antonia    la
(null)      (null)       lambros    ka

您将看到与 LEFT 连接相同的结果,但空值不会是另一边。

在这两种情况下,(空)行表示驱动表中与非驱动表不匹配的行。

于 2014-02-11T17:05:41.557 回答
1

在这里,您正在进行自连接并与具有不相等连接条件的右外连接相结合;

据我了解:当它要求右连接时,这意味着它只会从表的右侧检索满足连接条件的行的记录,并将它们与左侧的行(主表)结合起来满足条件的地方。

而且因为主表是来自左侧的表,所以当你进行左连接时,它将检索左表(主表)中的所有记录+右侧表中的记录行满足连接条件。

当涉及到内部连接时,它只会检索匹配的记录(行),其中两个表都满足连接条件。即使主表是左表,左表中不满足条件的行仍然不会包含在结果集中。

我花了一段时间才弄清楚,我希望它解释得很好并且可以提供帮助。(因为我以前也很难理解它)。

于 2021-01-29T08:59:02.370 回答