oracle关联表嵌套数量,Oracle SQL:最多联接一个关联实体

梅里顿,

这种方法使用嵌套的内联视图。我已经在大型数据集上证明了这种方法,它的性能非常好。

理解查询的最佳方法是从最内部的“m”内联视图开始。为了调试和清晰起见,我添加了计数。这确定了最大值(即最近的???)每个建筑物的地址ID:

select maxa.b_id, max(maxa.a_id) a_id, count(*) c

from address maxa

group by maxa.b_id;

下一个“a”内联视图使用上面的“m”内联视图来决定要获取哪个地址,然后联接到该地址ID以返回一组地址字段:

select ma.b_id, ma.a_id, ma.addr1, ma.addr2, ma.addr3, m.c

from address ma,

( select maxa.b_id, max(maxa.a_id) a_id, count(*) c

from address maxa

group by maxa.b_id ) m

where ma.a_id = m.a_id;

上面的“a”内联视图将一组转换后的地址传递给最终查询。当建筑物和地址之间的关系为1到0..n时,建筑物和“a”之间的关系为1到0..1,这是一个基本的外部连接:

select b.b_id, b.b_code, b.b_name, a.*

from building b,

( select ma.b_id, ma.a_id, ma.addr1, ma.addr2, ma.addr3, m.c

from address ma,

( select maxa.b_id, max(maxa.a_id) a_id, count(*) c

from address maxa

group by maxa.b_id ) m

where ma.a_id = m.a_id ) a

where b.b_id = a.b_id (+);

这种方法的主要优点是:

传递任意数量的地址列。

确定性,每次运行时返回完全相同的结果。

不要在最后的查询中放置不适当的复杂性,这肯定比这个更复杂。

“A”内联视图可以很容易地封装在数据库视图中,可以称之为最新的“地址”视图:

create view latest_address (b_id, a_id, addr1, addr2, addr3, c) as

select ma.b_id, ma.a_id, ma.addr1, ma.addr2, ma.addr3, m.c

from address ma,

( select maxa.b_id, max(maxa.a_id) a_id, count(*) c

from address maxa

group by maxa.b_id ) m

where ma.a_id = m.a_id;

select b.b_id, b.b_code, b.b_name, a.*

from building b, latest_address a

where b.b_id = a.b_id (+);

享受吧!

马修

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值