oralce中两个不同sql排序问题,求帮忙修改sql

快跑蜗牛哥 2016-10-11 05:34:34
先有两个不同系统,一个是vb做的,一个是java做的,
本来 修改两个sql多加几个栏位排序可以满足要求,但 还有另外一个系统也有相关sql。(不能改动)
另一个系统排序与 vb的排序相同,要求 vb的sql不能改动,改动另外一个sql使得显示结果顺序一致。

vb 中的sql,不能修改此sql。

select C.sequenceno,A.contractid,A.invoiceno,A.fromcountry,A.destination,
A.handbookno,A.importcustom,A.exportcustom,A.forwardername,
A.hktruckno,A.chtruckno,A.containerno,A.tradepat,A.bargainclass,
A.piece,A.packingname,A.grossweight,A.netweight,
A.ciftotal,A.fobtotal,A.shipcost,A.insurancecost,A.repaircost,
A.fxnum,A.palletqtycount,A.palletweightcount,
B.shipno,B.itemno,decode(B.itemdesc,null,' ',B.itemdesc) as itemdesc,
B.quantity,
decode(B.shipmentchr2,null,' ',B.shipmentchr2) as shipmentchr2,
B.itempacking,B.itemnetweight,
B.itemgross,B.originalcountry,B.boxno,B.shipclass,
B.itemgroup,B.autogroupno,B.quantity * B.unitprice as itemprice,
C.customcode,C.chitemname,C.unit,B.unitprice,C.unitlaborprice,
B.curr
,B.ITEMPRICE_MANUAL
from
ct_t_invoice A,(select * from ct_t_shipmenttemp where userid='ADMIN') B,ct_t_contractitem C
where
A.invoiceno=B.invoiceno AND A.contractid=C.contractid AND B.itemno=C.itemno
AND A.invoiceno='45145000049' order by B.itemgroup,B.autogroupno

得到的如下数据:
sequenceno
59
35
31
16
14
48
39
51
66
47
1
另一个系统中的sql

select t.sequenceno,
t.customcode,
t.chitemname,
sum(t.quantity) as quantity,
t.unit,
sum(itemnetweight) as itemnetweight,
t.originalcountry,
t.unitprice,
sum(t.quantity * t.unitprice) itemtotalprice,
t.curr
from (select A.invoiceno,
A.contractid,
B.itemno,
B.quantity,
B.itempacking,
B.itemgroup,
B.autogroupno,
B.itemgross,
B.unitweight * B.quantity as itemnetweight,
decode(trim(B.shipmentchr2),
null,
0,
'',
0,
to_number(B.shipmentchr2)) as shipmentchr2,
decode(sign(B.ITEMPRICE_MANUAL - 0),
1,
B.ITEMPRICE_MANUAL,
B.quantity * B.unitprice) as itemprice,
C.sequenceno,
C.chitemname,
B.unitprice,
B.curr,
C.CUSTOMCODE,
c.unit,
b.originalcountry
from ct_t_invoice A, ct_t_shipment B, ct_t_contractitem C
where A.invoiceno = B.invoiceno
AND A.INVOICENO='45145000049'
and A.contractid = C.contractid
and B.itemno = C.itemno
order by B.itemgroup, B.autogroupno
) t
group by sequenceno,customcode,chitemname,unit,originalcountry,unitprice,curr,itemgroup,autogroupno
order by itemgroup, autogroupno;

得到的如下数据:
sequenceno
59
39
47
48
35
31
1
51
66
16
14
...全文
586 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
双子梦魇 2016-10-28
  • 打赏
  • 举报
回复
不知道会不会和A 表的row_id相关
快跑蜗牛哥 2016-10-17
  • 打赏
  • 举报
回复
引用 35 楼 u010412440 的回复:
[quote=引用 28 楼 qw0907 的回复:] [quote=引用 20 楼 u010412440 的回复:] 如果只看SQL有时候很难看出问题,我建议给你的方法是首选把SQL的不必要查询字段先删除简化SQL,然后将sequenceno,itemgroup, autogroupno这三列都查询出来看结果排序是怎样的,两个SQL之所以sequenceno结果顺序不一样是因为itemgroup, autogroupno这两个值得排序引起的,只要找到这两个列的值为什么有差异就能解决问题。现在上班时间没太多时间看SQL,提供一下思路希望能帮你解决掉问题。
谢谢你的回复, itemgroup, autogroupno这两个字段的值没什么差异,值为 0,1[/quote] 如果只是有0,1的话相同值得排序是根据查询结果的自然排序排列的,要想修改第二个SQL使其与第一个保持一致得弄清楚第一个的执行计划,弄明白了才能修改第二个,这个感觉有点不好控制啊。[/quote] 是不好控制,要求又不能更改,所以卡在这里了。
com_jia 2016-10-17
  • 打赏
  • 举报
回复
引用 28 楼 qw0907 的回复:
[quote=引用 20 楼 u010412440 的回复:] 如果只看SQL有时候很难看出问题,我建议给你的方法是首选把SQL的不必要查询字段先删除简化SQL,然后将sequenceno,itemgroup, autogroupno这三列都查询出来看结果排序是怎样的,两个SQL之所以sequenceno结果顺序不一样是因为itemgroup, autogroupno这两个值得排序引起的,只要找到这两个列的值为什么有差异就能解决问题。现在上班时间没太多时间看SQL,提供一下思路希望能帮你解决掉问题。
谢谢你的回复, itemgroup, autogroupno这两个字段的值没什么差异,值为 0,1[/quote] 如果只是有0,1的话相同值得排序是根据查询结果的自然排序排列的,要想修改第二个SQL使其与第一个保持一致得弄清楚第一个的执行计划,弄明白了才能修改第二个,这个感觉有点不好控制啊。
快跑蜗牛哥 2016-10-17
  • 打赏
  • 举报
回复
引用 33 楼 wmxcn2000 的回复:
[quote=引用 32 楼 qw0907 的回复:] 哦,谢谢!! 我再想想其他办法吧
本身 VB 端的排序结果,就是不稳定的, java 端只能 依赖vb 的结果,才能保持 一致; 看看能不能申请一下访问 ct_t_shipmenttemp 表吧[/quote] 好的,谢谢!!
卖水果的net 2016-10-17
  • 打赏
  • 举报
回复
引用 32 楼 qw0907 的回复:
哦,谢谢!! 我再想想其他办法吧
本身 VB 端的排序结果,就是不稳定的, java 端只能 依赖vb 的结果,才能保持 一致; 看看能不能申请一下访问 ct_t_shipmenttemp 表吧
快跑蜗牛哥 2016-10-17
  • 打赏
  • 举报
回复
引用 31 楼 wmxcn2000 的回复:
[quote=引用 30 楼 qw0907 的回复:] 这涉及到权限控制等问题,
这个就没什么好办法了;排序没有了依据;[/quote] 哦,谢谢!! 我再想想其他办法吧
卖水果的net 2016-10-17
  • 打赏
  • 举报
回复
引用 30 楼 qw0907 的回复:
这涉及到权限控制等问题,
这个就没什么好办法了;排序没有了依据;
快跑蜗牛哥 2016-10-17
  • 打赏
  • 举报
回复
引用 29 楼 wmxcn2000 的回复:
[quote=引用 26 楼 qw0907 的回复:] 可以这样理解,ct_t_shipmenttemp 只有vb代码中使用。 如果 vb,java中的sql都可以改的话,很容易实现,但使用者要求,不能更改vb中的sql,只能修改java中的sql
java 中为什么不能使用 ct_t_shipmenttemp 这个呢?[/quote] 这涉及到权限控制等问题,
卖水果的net 2016-10-17
  • 打赏
  • 举报
回复
引用 26 楼 qw0907 的回复:
可以这样理解,ct_t_shipmenttemp 只有vb代码中使用。 如果 vb,java中的sql都可以改的话,很容易实现,但使用者要求,不能更改vb中的sql,只能修改java中的sql
java 中为什么不能使用 ct_t_shipmenttemp 这个呢?
快跑蜗牛哥 2016-10-17
  • 打赏
  • 举报
回复
引用 20 楼 u010412440 的回复:
如果只看SQL有时候很难看出问题,我建议给你的方法是首选把SQL的不必要查询字段先删除简化SQL,然后将sequenceno,itemgroup, autogroupno这三列都查询出来看结果排序是怎样的,两个SQL之所以sequenceno结果顺序不一样是因为itemgroup, autogroupno这两个值得排序引起的,只要找到这两个列的值为什么有差异就能解决问题。现在上班时间没太多时间看SQL,提供一下思路希望能帮你解决掉问题。
谢谢你的回复, itemgroup, autogroupno这两个字段的值没什么差异,值为 0,1
快跑蜗牛哥 2016-10-17
  • 打赏
  • 举报
回复
引用 21 楼 u010412440 的回复:
另外你java语句里子查询里边嵌套order by B.itemgroup, B.autogroupno是个什么意思?
这个嵌套的排序是可以去掉,不影响结果。
快跑蜗牛哥 2016-10-17
  • 打赏
  • 举报
回复
引用 25 楼 wmxcn2000 的回复:
[quote=引用 24 楼 qw0907 的回复:] 如果 java 中 的sql 不能使用表 ct_t_shipmenttemp 只能使用另外 3个表,请问该如何修改,
那就麻烦了,顺序就都变了; ct_t_shipmenttemp 是一张临时表?[/quote] @卖水果的net 可以这样理解,ct_t_shipmenttemp 只有vb代码中使用。 如果 vb,java中的sql都可以改的话,很容易实现,但使用者要求,不能更改vb中的sql,只能修改java中的sql
卖水果的net 2016-10-15
  • 打赏
  • 举报
回复
引用 24 楼 qw0907 的回复:
如果 java 中 的sql 不能使用表 ct_t_shipmenttemp 只能使用另外 3个表,请问该如何修改,
那就麻烦了,顺序就都变了; ct_t_shipmenttemp 是一张临时表?
快跑蜗牛哥 2016-10-15
  • 打赏
  • 举报
回复
引用 23 楼 wmxcn2000 的回复:
接着 22# 说 如果数据量比较小的话,可以用这个方法,数据量大的话,效率上你再测试一下 如你的在 java 中可以跑多个语句(或可以使用存储过程)的话,就更好了, 把下面那段,单独执行一下,放在一个临时表中,效率会有所提升的; 有什么问题,你再来艾特我,我私信都可以的;
@卖水果的net 大神,非常感谢,数据量不是很大, 如果 java 中 的sql 不能使用表 ct_t_shipmenttemp 只能使用另外 3个表,请问该如何修改,
快跑蜗牛哥 2016-10-14
  • 打赏
  • 举报
回复
@jdsnhan 求帮助!!!!
快跑蜗牛哥 2016-10-14
  • 打赏
  • 举报
回复
引用 16 楼 js14982 的回复:
研究了一下,我表示无解啊,你看看水果大神有没办法,就我所知,相同的值,后面那个排序是oracle随机的,没有规律
谢谢!!!
引用 2 楼 wmxcn2000 的回复:
只能看到一列数据,并且没什么规律,建议给出一些测试数据( insert into 形式的)
@卖水果的net 大神,求帮助!!!
卖水果的net 2016-10-14
  • 打赏
  • 举报
回复
接着 22# 说 如果数据量比较小的话,可以用这个方法,数据量大的话,效率上你再测试一下 如你的在 java 中可以跑多个语句(或可以使用存储过程)的话,就更好了, 把下面那段,单独执行一下,放在一个临时表中,效率会有所提升的; 有什么问题,你再来艾特我,我私信都可以的;
卖水果的net 2016-10-14
  • 打赏
  • 举报
回复

-- m 是你原来 java 中的语句,一点没动 ,你接着向下看
with m as (
select t.sequenceno,
       t.customcode,
       t.chitemname,
       sum(t.quantity) as quantity,
       t.unit,
       sum(itemnetweight) as itemnetweight,
       t.originalcountry,
       t.unitprice,
       sum(t.quantity * t.unitprice) itemtotalprice,
       t.curr
  from (select A.invoiceno,
               A.contractid,
               B.itemno,
               B.quantity,
               B.itempacking,
               B.itemgroup,
               B.autogroupno,
               B.itemgross,
               B.unitweight * B.quantity as itemnetweight,
               decode(trim(B.shipmentchr2),
                      null,
                      0,
                      '',
                      0,
                      to_number(B.shipmentchr2)) as shipmentchr2,
               decode(sign(B.ITEMPRICE_MANUAL - 0),
                      1,
                      B.ITEMPRICE_MANUAL,
                      B.quantity * B.unitprice) as itemprice,
               C.sequenceno,
               C.chitemname,
               B.unitprice,
               B.curr,
               C.CUSTOMCODE,
               c.unit,
               b.originalcountry
          from ct_t_invoice A, ct_t_shipment B, ct_t_contractitem C
         where A.invoiceno = B.invoiceno
           AND A.INVOICENO='45145000049'
           and A.contractid = C.contractid
           and B.itemno = C.itemno
           order by B.itemgroup, B.autogroupno
           ) t
 group by sequenceno,customcode,chitemname,unit,originalcountry,unitprice,curr,itemgroup,autogroupno
  order by itemgroup, autogroupno
  ),  -- 原 java 中的语句,到这里。
order_table as (  -- 这个是你在 VB 中的语句,现在整理下,只剩下 no 和一个自定义的 序号
  select t.sequenceno , rownum rn from (
select C.sequenceno
         from   
        ct_t_invoice A,(select * from ct_t_shipmenttemp where userid='ADMIN')  B,ct_t_contractitem C
         where  
        A.invoiceno=B.invoiceno AND A.contractid=C.contractid AND B.itemno=C.itemno    
        AND A.invoiceno='45145000049' order by  B.itemgroup,B.autogroupno
) t 
)
select m.* from m inner join order_table o on m.sequenceno = o.sequenceno 
order by o.rn
com_jia 2016-10-14
  • 打赏
  • 举报
回复
另外你java语句里子查询里边嵌套order by B.itemgroup, B.autogroupno是个什么意思?
com_jia 2016-10-14
  • 打赏
  • 举报
回复
如果只看SQL有时候很难看出问题,我建议给你的方法是首选把SQL的不必要查询字段先删除简化SQL,然后将sequenceno,itemgroup, autogroupno这三列都查询出来看结果排序是怎样的,两个SQL之所以sequenceno结果顺序不一样是因为itemgroup, autogroupno这两个值得排序引起的,只要找到这两个列的值为什么有差异就能解决问题。现在上班时间没太多时间看SQL,提供一下思路希望能帮你解决掉问题。
加载更多回复(17)

679

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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