如何在另一个表的列中插入选择查询的结果

Posted

技术标签:

【中文标题】如何在另一个表的列中插入选择查询的结果【英文标题】:How to insert the result of the select query in another table's column 【发布时间】:2021-02-25 06:38:42 【问题描述】:
SELECT segment_name TABLE_NAME, SUM(bytes) table_size
  FROM USER_SEGMENTS
 WHERE SEGMENT_TYPE = 'TABLE'
 GROUP BY segment_name
 ORDER BY segment_name ASC;

INSERT INTO R_LOG (DOMAINID, SOURCENAME, TERMINALID,userid, DETAILTEXT)
VALUES (1, 'tables_job', 'TEST', 'GUEST',?????);

我想将查询输出(两列)存储在R_LOG 表的DETAILTEXT 列(单列)中

SELECT segment_name TABLE_NAME, SUM(bytes) table_size
  FROM USER_SEGMENTS
 WHERE SEGMENT_TYPE = 'TABLE'
 GROUP BY segment_name
 ORDER BY segment_name ASC;

我的这部分代码运行良好 - 但我无法插入值。

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

我猜你想在目标列中连接列 segment_nameSUM(bytes)。 使用SELECT 而不是VALUES

INSERT INTO R_LOG (DOMAINID, SOURCENAME, TERMINALID,userid, DETAILTEXT) 
SELECT 1, 'tables_job', 'TEST', 'GUEST', segment_name || ' ' || SUM(bytes) 
FROM USER_SEGMENTS
WHERE SEGMENT_TYPE='TABLE'
GROUP BY segment_name
ORDER BY segment_name ASC;

【讨论】:

【参考方案2】:

您似乎需要LISTAGG() 函数和INSERT 语句

INSERT INTO R_LOG
SELECT 1, 'tables_job', 'TEST', 'GUEST', 
       LISTAGG('Table : '||segment_name||'- size: '|| SUM(bytes),', ') 
        WITHIN GROUP (ORDER BY segment_name)
  FROM USER_SEGMENTS
 WHERE SEGMENT_TYPE = 'TABLE'
 GROUP BY segment_name

如果遇到 ORA-01489:result of string concatenation is too long 错误,则将包含LISTAGG()函数的最后一列替换为

RTRIM(XMLAGG(XMLELEMENT(e, 'Table : '||segment_name||'- size: '|| SUM(bytes), ',')
      .EXTRACT('//text()') ORDER BY segment_name)
      .GetClobVal(),
      ',')

【讨论】:

@tej 请看看Demo,有什么问题..?顺便说一句,DETAILTEXT 是 CLOB 类型,或者如果类型是 VARCHAR2,它的长度是多少 ..?【参考方案3】:

您可以直接使用INSERT INTO <TABLE_NAME>[(columns)] SELECT ..,如下:

INSERT INTO R_LOG (
    DOMAINID,
    SOURCENAME,
    TERMINALID,
    USERID,
    DETAILTEXT
)
    SELECT 1, -- need to use some sequence here
           'tables_job',
           'TEST',
           'GUEST',
           SEGMENT_NAME || ' ' || SUM(BYTES)
      FROM USER_SEGMENTS
     WHERE SEGMENT_TYPE = 'TABLE'
     GROUP BY SEGMENT_NAME; 
     -- Order by is not needed

【讨论】:

以上是关于如何在另一个表的列中插入选择查询的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个表中过滤出其 id 出现在另一个表的列中的记录

如何计算 ID 在不同表的列中出现的次数

如何在 DolphinDB 表的列中选择唯一元素?

TSQL - 如何在另一列中提取具有最小值和最大值的列

如何在另一列中按条件分组的列中查找下一个日期?

如何将查询计算插入到现有实体的列/属性中?