2在SQL语句中右外连接

时间:2010-07-14 21:35:22

标签: sql tsql join outer-join

我在理解一个非常简单而有趣的查询方面存在一个问题,该查询涉及2个带有“非顺序”on-expression的右外连接。这是查询:

select * from C 
right outer join A on A.F1 = C.F1 
right outer join B on B.F1 = C.F1;

以下是表格:

create table A ( F1 varchar(200)); 
create table B ( F1 varchar(200)); 
create table C ( F1 varchar(200));

以下是一些行:

insert into A values ('A'); 
insert into A values ('B');
insert into A values ('C');
insert into B values ('B'); 
insert into B values ('C');
insert into B values ('D');
insert into C values ('A'); 
insert into C values ('C'); 
insert into C values ('D');

注意:查询选择*来自C右外连接A A.F1 = C.F1右外连接B上B.F1 = C.F1; 连接表达式均指表C

查询返回(在列中然后是行)

(NULL,NULL, B),(C, C, C).(NULL, **NULL**, D)

我希望(我对SQL的了解不多)

(NULL,NULL, B),(C, C, C),(NULL, **D**, D)

SQL(在Microsoft SQL和MySQL上测试)获得这些值的逻辑顺序是什么。

在我的“执行”序列中,我坐在表A的A,null(对于B),C,null(对于D)和表B中的值A,null(对于A),B,C,D之前“产品”与C(B,C,D)合并。

Gawie PS:我使用MySQL以及Microsoft SQL 2008对此进行了测试......结果相同。

4 个答案:

答案 0 :(得分:1)

要加入的表“A”中没有D值,这就是它返回NULL而不是您期望的D的原因。当您通过列别名确定值来自哪个表时,更容易看到:

SELECT c.f1 AS c, a.f1 AS a, b.f1 AS b 
  FROM c 
RIGHT JOIN A on A.F1 = C.F1 
RIGHT JOIN B on B.F1 = C.F1

答案 1 :(得分:0)

表A不包含字段“D”,因此D不可能出现在结果集Gawie的第二列中。结果集中的字段将是C.F1,A.F1,B.F1(与表在连接中出现的顺序相同)。

答案 2 :(得分:0)

右连接按它们出现的顺序(从左到右)进行评估。让我们从from C开始:

C        -->  (A), (C), (D)

然后right join A,加入A.F1 = C.F1

C, A     -->  (A, A), (NULL, B), (C, C)

然后right join B(匹配第一列,因为联接在B.F1 = C.F1上):

C, A, B  -->  (NULL, NULL, B), (C, C, C), (NULL, NULL, D)

因为from C right join A在第一列中不包含D,right join B无法匹配,并为C和A的列追加包含NULL的行,D来自B的列。

答案 3 :(得分:0)

C,A - > (A,A),(NULL,B),(C,C)

然后右连接B(匹配第一列,因为连接在B.F1 = C.F1上):

C,A,B - > (NULL,NULL,B),(C,C,C),(NULL,NULL,D)

这是我迷路的地方......

为什么C,A,B不等于(NULL,B,B),......等

表示C,A表示B列等于(NULL,B) 右外连接(NULL,B)与B应该产生(NULL,B,B)......除非匹配是相反的! C,A,B - > (NULL,B,B)(这显然是错误的 - 只是不完全理解为什么)