当前位置:   article > 正文

Oracle多行数据合并一行显示【SQL实现详细解析】_oracle中sql语句查询出来有多行数据要求显示在一行

oracle中sql语句查询出来有多行数据要求显示在一行
背景

前段时间,优化一张报表,在优化一条SQL查询时候,出现这样一个问题:

结果列中,有某一列因为条件关联原因,查询的结果会报:

ORA-01427: single-row subquery returns more than one row,顾名思义就是查询的结果出现多行了,与其他列保持不一致。

对于这种状况,之前开发的逻辑是这样的:先查询除了此列外的所有结果,然后再把此列的结果一一Reset到报表里。

这样无疑增加了很大的time cost,刚开始因为数据量不多,还没出现速度上的隐患,随时间推移,便暴露出来了。对此做法,以如今pro 数据增长速度坚决不可取。

后来在网上找了例子,可以把多行数据合并成一行显示,查询速度快得惊人。当时没有好好研究其原理,现在有空摸索下其实现逻辑。


Template SQL:

  1. SELECT
  2. PICKING_KEY,TRANSLATE (LTRIM (text, '/'), '*/', '*,') RESULT
  3. FROM (SELECT ROW_NUMBER () OVER (PARTITION BY PICKING_KEY ORDER BY PICKING_KEY,lvl DESC) rn,
  4. PICKING_KEY,
  5. text
  6. FROM (SELECT PICKING_KEY,
  7. LEVEL lvl,
  8. SYS_CONNECT_BY_PATH (ship_mark, '/') text
  9. FROM (SELECT
  10. ship_mark AS ship_mark,
  11. PICKING_KEY,
  12. ROW_NUMBER () OVER (PARTITION BY PICKING_KEY ORDER BY PICKING_KEY, ship_mark) x
  13. FROM
  14. ( SELECT
  15. DISTINCT ship_mark AS ship_mark,
  16. PICKING_KEY
  17. FROM con_pack_carton, con_pack_order
  18. WHERE CON_PACK_CARTON.CON_PACK_KEY = CON_PACK_ORDER.CON_PACK_KEY
  19. AND CON_PACK_ORDER.PICKING_KEY in ('0002927779')
  20. AND CON_PACK_ORDER.BATCH_NO = 1
  21. ORDER BY ship_mark,PICKING_KEY)
  22. ORDER BY ship_mark, PICKING_KEY)
  23. CONNECT BY PRIOR PICKING_KEY = PICKING_KEY AND PRIOR x - 1 = x)
  24. )
  25. WHERE rn = 1;
结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/766531
推荐阅读
相关标签
  

闽ICP备14008679号