最近改一个问题,改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的结果却是正确的!
当时就很郁闷,同样的参数,页面调用存储过程和在数据库中直接执行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;
最终问题解决了。总结:对于维护项目,常常改别人的代码,而且有时候根本就不熟悉业务逻辑,所以常常是很简单的问题定位起来很困难,所以某一段代码的目的很重要,也就是这段程序要实现什么功能。转换思路看问题。