我在理解一个非常简单而有趣的查询方面存在一个问题,该查询涉及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对此进行了测试......结果相同。
答案 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)(这显然是错误的 - 只是不完全理解为什么)