求一个SQL...求指导

kenticny0270 2012-12-05 09:35:21
需求:有两张表 tableA 和 tableB
tableA 的字段有 customid managerid deposit
tableB 的字段有 customid managerid loan
两张表都是以(customid,managerid)作为唯一标识
现在要有个查询,查询到的字段为customid managerid deposit loan
tableA和tableB中的customid和managerid 有部分重复,还有一部分是不同的。
如果customid和managerid同时存在在两张表中,就合并
例如:
tableA customid managerid deposit
1001 3000 4000
tableB customid managerid loan
1001 3000 3000
查询结果 customid managerid deposit loan
1001 3000 4000 3000
如果customid和managerid单独存在的话:
例如:
tableA customid managerid deposit
1001 2000 3000
tableB customid managerid loan
2001 3000 4000
查询结果 customid managerid deposit loan
1001 2000 3000 NULL
2001 3000 NULL 4000


需求说完了...不知道说清楚了么....求各位大神指教....
...全文
223 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
大连豆包 2012-12-15
  • 打赏
  • 举报
回复
索引做好了,union效率也很好。
槑党--一缕风 2012-12-10
  • 打赏
  • 举报
回复
看看执行计划
引用 6 楼 kenticny0270 的回复:
忘了说了~~这个数据量是百万级的....有什么能够比较效率的方法么
「已注销」 2012-12-08
  • 打赏
  • 举报
回复
忘了说了~~这个数据量是百万级的....有什么能够比较效率的方法么
izj 2012-12-08
  • 打赏
  • 举报
回复
如果还不是你想要的效果,那你可以分区查询。。 提高效率
izj 2012-12-08
  • 打赏
  • 举报
回复
引用 6 楼 kenticny0270 的回复:
忘了说了~~这个数据量是百万级的....有什么能够比较效率的方法么
你执行上的Sql,看看执行计划,消耗的内存与时间。。就知道哪个效率高了。
izj 2012-12-07
  • 打赏
  • 举报
回复
支持。。。用full join...


select decode(a.id,null,b.id,a.id) id ,decode(a.mid,null,b.mid,a.mid) mid , a.did,b.pid from a full join b on a.id = b.id and a.mid = b.mid

BenChiM888 2012-12-06
  • 打赏
  • 举报
回复
正解,不过 greatest 是oracle自带的函数 最好用case when 这样的sql99通用语法,但是只是在oracle上适用 greatest 绝对好使。
引用 2 楼 fw0124 的回复:
用full join就可以了。 SQL code?12345select greatest(nvl(tableA.customid,0),nvl(tableB.customid,0)) customid, greatest(nvl(tableA.managerid,0),nvl(tableB.managerid,0)) managerid, ……
304的的哥 2012-12-05
  • 打赏
  • 举报
回复
来个通用版本吧,case其实效率也挺高的!

--db2上测试,
with taba as(
     select '1001' cid,'3000' mid,4000 dps from sysibm.sysdummy1
     union all
     select '1002' cid,'8000' mid,47000 dps from sysibm.sysdummy1),
     tabb as(
     select '1001' cid,'2000' mid,3000 ln from sysibm.sysdummy1
     union all
     select '1001' cid,'3000' mid,5000 ln from sysibm.sysdummy1)
select case when a.cid is null then b.cid else a.cid end,
          case when a.mid is null then b.mid else a.mid end,
          dps,ln
  from taba a full join tabb b
    on a.cid=b.cid
   and a.mid=b.mid
--------------------------------
1001	3000	4000	5000
1001	2000		3000
1002	8000	47000	
fw0124 2012-12-05
  • 打赏
  • 举报
回复
用full join就可以了。
select greatest(nvl(tableA.customid,0),nvl(tableB.customid,0)) customid,
       greatest(nvl(tableA.managerid,0),nvl(tableB.managerid,0)) managerid,
	   deposit,loan  from
  tableA full join tableB on
  tableA.customid=tableB.customid and tableA.managerid=tableB.managerid;
Java_zou 2012-12-05
  • 打赏
  • 举报
回复
直接union

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧