我在理解一个非常简单但有趣的查询时遇到了问题,该查询涉及带有“非顺序”表达式的 2 个右外连接。这是查询:
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');
注意:查询select * from C right outer join A on A.F1 = C.F1 right outer join B on 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 中,null(对于 A)、B、C、D 在“产品”之前与 C (B,C,D) 合并。
Gawie PS:我使用 MySQL 和 Microsoft SQL 2008 对此进行了测试……结果相同。