【问题标题】: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;

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

任何帮助将不胜感激

【问题讨论】:

    标签: c# sql oracle


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2011-09-15
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2015-12-22
        • 2016-09-28
        相关资源
        最近更新 更多