【问题标题】:Add a group of concatenated rows from a table to another table. Script should work under SQL Server, Oracle, PostgreSQL将一组连接的行从一个表添加到另一个表。脚本应该在 SQL Server、Oracle、PostgreSQL 下工作
【发布时间】:2021-08-08 14:19:09
【问题描述】:

如果我在像TEMP_TABLE (id int, text VARCHAR(max)); 这样的表中有一组列 我想将这个表的所有记录连接到另一个表中,考虑到这个脚本也适用于 SQL Server、Oracle、PostgrSQL,什么是最好的解决方案。

所以记录是这样的:

insert into TEMP_TABLE(1, 'aaa');
insert into TEMP_TABLE(2, 'bbb');
insert into TEMP_TABLE(3, 'ccc');
...
insert into TEMP_TABLE(10, 'zzz');

结果应该是这样的

insert into DEST_TABLE (key,name,value) values (1,'concatenated strings','aaabbbccc...zzz')

谢谢!

【问题讨论】:

  • 为什么需要在不同数据库中工作的代码? (除此之外,这是不可能的)。
  • 因为客户在不同的数据库下工作,我必须制作一个适用于所有客户的插入。
  • 。 .那是愚蠢的差事。很少有代码未经修改就可以跨不同的数据库工作。您可能应该在各个数据库中创建视图来做您想做的事情。

标签: sql sql-server postgresql oracle concatenation


【解决方案1】:

没有办法做到这一点与所有数据库兼容。因为您的描述特定于 SQL Server (varchar(max)),所以您甚至无法在任何其他数据库中创建表。该数据库中的解决方案是:

select string_agg(text, '') within group (order by id)
from temp_table;

Postgres 也使用string_agg(),但语法是:

select string_agg(text, '' order by id desc)

在甲骨文中:

select listagg(text, '') within group (order by id)

好吧,如果你知道值的最大数量,实际上有一种可移植的方式:

select concat(case when seqnum = 1 then text end,
              concat(case when seqnum = 2 then text end,
                     concat(case when seqnum = 3 then text,
                            . . .
                           )
                    )
             )
from (select t.*, row_number() over (order by id) as seqnum
      from t
     ) t;

不幸的是,Oracle 中的concat() 只接受两个参数,因此您必须不断嵌套它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多