【问题标题】:Oracle Sql select all values in a row without using aggregate functions and proceduresOracle Sql 选择一行中的所有值,而不使用聚合函数和过程
【发布时间】:2020-03-06 10:49:38
【问题描述】:

我有这个代码:

select eto.id,( epe.surname || ' ' || epe.name  || ' ' || epe.patronymic) fio
                        from employee_trip_orders eto
                        left join employee_card_order_links ecol
                        on eto.id = ecol.trip_order_id
                        left join employee_trip_cards etc
                        on ecol.trip_card_id = etc.employee_trip_card_id 
                        left join eip_persons.employees epe
                        on etc.employee_id = epe.employee_id
                        where eto.id=2223
                        order by eto.id

以及执行此代码的结果

id     fio
------------
2223 John Smith Brown
2223 Jack Orange Apple
2223 Jordan Stinky Tomato

我想将其转换为带有逗号分隔符的单行

id     fio
-------------------------------
2223 |  John Smith Brown,
     |  Jack Orange Apple,
     |  Jordan Stinky Tomato
-------------------------------

如何在不使用外部函数、分组和聚合函数的情况下实现这一目标?谢谢

【问题讨论】:

  • 不,不,@a_horse。 “......不使用外部函数,分组和聚合函数”。如果我是你(OP),我会把它写在一张纸上,在适当的地方加上逗号。该方法不使用外部函数等。
  • @Littlefoot:没有聚合函数的聚合似乎是一种相当徒劳的尝试
  • 使用listagg()有什么问题?
  • @Littlefoot mb 我还需要一个选择吗?
  • @a_horse (“...似乎是一个相当徒劳的尝试”)。当然可以。进入“如何让简单的事情变得复杂”。

标签: sql oracle join string-aggregation


【解决方案1】:

您可以使用connect by 查询来完成,但它比简单的listagg() 更慢且更复杂。

select id, ltrim(sys_connect_by_path(fio, ', '), ', ') names
  from (select row_number() over (partition by id order by fio) rn, id, fio from t)
  where connect_by_isleaf = 1
  connect by id = prior id and rn = prior rn + 1
  start with rn = 1

dbfiddle

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2020-12-24
    • 2017-01-29
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2015-08-03
    相关资源
    最近更新 更多