Недавно я исправил некоторую ошибку: в состоянии соединения был rownum.
Примерно так: левое соединение t1 на t1.id = t2.id и rownum <2.Так что предполагалось вернуть только одну строку независимо от «левого соединения». </p>
Когда я углубился в это, я понял, что не понимаю, как Oracle оценивает rownum в состоянии «левого соединения».Давайте создадим две таблицы sampe: master и detail.
create table MASTER
(
ID NUMBER not null,
NAME VARCHAR2(100)
)
;
alter table MASTER
add constraint PK_MASTER primary key (ID);
prompt Creating DETAIL...
create table DETAIL
(
ID NUMBER not null,
REF_MASTER_ID NUMBER,
NAME VARCHAR2(100)
)
;
alter table DETAIL
add constraint PK_DETAIL primary key (ID);
alter table DETAIL
add constraint FK_DETAIL_MASTER foreign key (REF_MASTER_ID)
references MASTER (ID);
prompt Disabling foreign key constraints for DETAIL...
alter table DETAIL disable constraint FK_DETAIL_MASTER;
prompt Loading MASTER...
insert into MASTER (ID, NAME)
values (1, 'First');
insert into MASTER (ID, NAME)
values (2, 'Second');
commit;
prompt 2 records loaded
prompt Loading DETAIL...
insert into DETAIL (ID, REF_MASTER_ID, NAME)
values (1, 1, 'REF_FIRST1');
insert into DETAIL (ID, REF_MASTER_ID, NAME)
values (2, 1, 'REF_FIRST2');
insert into DETAIL (ID, REF_MASTER_ID, NAME)
values (3, 1, 'REF_FIRST3');
commit;
prompt 3 records loaded
prompt Enabling foreign key constraints for DETAIL...
alter table DETAIL enable constraint FK_DETAIL_MASTER;
set feedback on
set define on
prompt Done.
Тогда у нас будет следующий запрос:
select * from master t
left join detail d on d.ref_master_id=t.id
Набор результатов предсказуем: у нас есть все строки из главной таблицы и3 строки из таблицы сведений, которые соответствуют этому условию d.ref_master_id = t.id.
Набор результатов
Затем я добавил «rownum = 1» в условие соединенияи результат был тот же
select * from master t
left join detail d on d.ref_master_id=t.id and rownum=1
Самое интересное, что я установил «rownum <-666» и снова получил тот же результат!</p>
select * from master t
left join detail d on d.ref_master_id=t.id and rownum<-666.
Из-за результирующего набора мы можем сказать, что это условие было оценено как «Истина» для 3 строк в таблице сведений.Но если я использую «внутреннее соединение», все идет так, как должно быть.
select * from master t
join detail d on d.ref_master_id=t.id and rownum<-666.
Этот запрос не возвращает ни одной строки, потому что я не могу представить, что rownum будет меньше -666: -)
Более того, если я использую синтаксис oracle для внешнего соединения, то с помощью «(+)» все тоже будет хорошо.
select * from master m ,detail t
where m.id=t.ref_master_id(+) and rownum<-666.
Этот запрос также не возвращает ни одной строки.
Может кто-нибудь сказать мне, что я неправильно понимаю с внешним соединением и rownum?