如何在另一个表的列中插入选择查询的结果
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_name
和 SUM(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
【讨论】:
以上是关于如何在另一个表的列中插入选择查询的结果的主要内容,如果未能解决你的问题,请参考以下文章