leftjoin,查询结果集排序后取第⼀条数据
最近改⼀个问题,改sql语句,⼤概意思是 左关联 A 表 和 B表,  按照条件查询后对查询结果排序后结果集的第⼀条数据。
原始的SQL:
select a.id from A a  left join B b on  a.id = b. id
where  a.userid = 'name'
and rownum = 1
order by a.p;
当时的问题是,如果查询的结果⾥有 多条数据,这个存储过程最后 返回的结果不正确,不是排序后的第⼀条数据。
调试的⽅法:⽤调⽤存储过程是的参数直接在数据库中直接执⾏该语句,看是否是存储过程中的SQL写的有问题,但是直接执⾏SQL的结果却是正确的!
多表left join
当时就很郁闷,同样的参数,页⾯调⽤存储过程和在数据库中直接执⾏SQL的语句怎么结果不⼀样呢。再看这个SQL写的也没问题啊。
很长时间过去了,还没定位出来,我⼀直在纠结怎么两种⽅式的运⾏结果不⼀致。最后突然想到,这个原来的开发这样写的⽬的就是想对查询结果先排序再取第⼀条数据,终于明⽩了。
SQL应该这样写:
select c.id from  (select a.id from A a  left join B b on  a.id = b. id
where  a.userid = 't1'
order by a.p) c where and rownum = 1;
最终问题解决了。
总结:对于维护项⽬,常常改别⼈的代码,⽽且有时候根本就不熟悉业务逻辑,所以常常是很简单的问题定位起来很困难,所以某⼀段代码的⽬的很重要,也就是这段程序要实现什么功能。转换思路看问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。