加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长百科 > 正文

oracle – 连接条件下的Rownum

发布时间:2021-04-01 05:17:59 所属栏目:站长百科 来源:网络整理
导读:最近我修复了一些错误:在连接条件下有rownum. 这样的事情:在t1.id = t2.id和rownum 2上左连接t1.因此无论“左连接”如何,它都应该只返回一行. 当我进一步研究这个时,我意识到我不明白Oracle如何在“左连接”条件下评估rownum. 让我们创建两个样本表:主表

最近我修复了一些错误:在连接条件下有rownum.

这样的事情:在t1.id = t2.id和rownum< 2上左连接t1.因此无论“左连接”如何,它都应该只返回一行. 当我进一步研究这个时,我意识到我不明白Oracle如何在“左连接”条件下评估rownum.
让我们创建两个样本表:主表和细节表.

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,1,'REF_FIRST1');
insert into DETAIL (ID,'REF_FIRST2');
insert into DETAIL (ID,NAME)
values (3,'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.

Result Set

然后我在连接条件中添加了“rownum = 1”,结果是一样的

select * from master t
left join detail d on d.ref_master_id=t.id and rownum=1

最有趣的是我设置了“rownum< -666”并再次得到了相同的结果!

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

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读