У меня проблема с пониманием очень простого, но интересного запроса, касающегося двух правых внешних объединений с «непоследовательными» выражениями. Вот запрос:
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 * из 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, null (для A), B, C, D перед «продукт» объединяется с C (B, C, D).
Gawie
PS: я протестировал это с использованием MySQL, а также Microsoft SQL 2008 ... с теми же результатами.