【问题标题】:how to merge specific cells table data in oracle如何在oracle中合并特定单元格表数据
【发布时间】:2023-04-04 20:07:01
【问题描述】:

我想根据序列 (SEQ) 编号属性有条件地连接 oracle 表中的文本单元格。有可能做到吗?我需要你的帮助来查询。

例如我有下表 DATA:

|-----------------|
|ID|CODE|SEQ|TEXT |
|--|----|---|-----|
|1 |a   |1  |text1|
|1 |a   |2  |text2|
|2 |b   |1  |text3|
|3 |c   |1  |text4|
|4 |d   |1  |text6|
|4 |d   |2  |text7|
|4 |d   |3  |text8|
-------------------

我要做的是创建一个新表 DATA1,它将具有相同 id 和代码的 TEXT 值与连接文本连接起来,以防 SEQ > 1。新表应如下所示:

|-------------------------|
|ID|CODE|TEXT             |
|--|----|-----------------|
|1 |a   |text1 text2      |
|2 |b   |text3            |
|3 |c   |text4            |
|4 |d   |text6 text7 text8|
---------------------------

【问题讨论】:

    标签: sql oracle concatenation


    【解决方案1】:

    listagg() 函数可能与按 id 和代码分组一起使用。

    select id, code, 
           listagg(text,' ') within group (order by seq) as text
      from tab
     group by id, code 
    

    Demo

    【讨论】:

    • 嗨巴拉巴罗斯。我想为一个巨大的表应用查询。有没有办法用 for 循环来做到这一点?如果在 sql 中很难循环,我们也可以使用 php
    • 嗨@Konstantinos。大多数情况下,这种方式比使用带有循环的 PL/SQL 更可取,其中包括我认为的详细脚本。并且使用游标不会为大量填充的表提供性能提升。
    • @Konstantinos - 你完全错了。游标、循环、从外部(通过 PHP)控制进程会导致性能损失,有时非常严重。正如 Barbaros 所展示的,在 DB 中做所有事情是目前首选的方式。如果花费“太长时间”,您可以确定使用您提到的方法会花费更长的时间。但是问问你自己——你为什么要首先做你要求的事情?您创建的新表格违反了表格设计的最基本原则。
    • @mathguy... 我需要根据序列连接第一个表中的文本。你有什么推荐的?
    • @Konstantinos - Barbaros 提出的解决方案。此外,“我需要连接......”并没有回答我提出的更高级别的问题。 为什么需要连接?或者,一个更好的问题 - 出于某种报告目的,也许您必须连接;但是为什么需要将连接的值存储在单独的 table 中(在磁盘上)?当对原始表进行更改时,您将如何使两个表保持同步?也许您应该根据 Barbaros 提出的代码创建一个 VIEW,而不是一个新表。
    猜你喜欢
    • 2019-11-30
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    相关资源
    最近更新 更多