[英]SQL insert into table by select from dual table
鉴于以下创建表 SQL (工作正常):
CREATE TABLE blah (CAT, BUSINESS_NR, TIME_A, VERSION, SOME_CODE) AS
SELECT 'ABC', 123, TIMESTAMP '2009-02-19 00:00:00 UTC', 1, 'OPP' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-08-16 00:00:00 UTC', 4, 'FFF' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-10-16 00:00:00 UTC', 5, 'ZZZ' FROM DUAL;
我现在必须切换到插入 stmt,因为已经创建了表 blah。
我的做法:
INSERT INTO blah (CAT, BUSINESS_NR, TIME_A, VERSION, SOME_CODE)
select
(
SELECT 'ABC', 123, TIMESTAMP '2009-02-19 00:00:00 UTC', 1, 'OPP' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-08-16 00:00:00 UTC', 4, 'FFF' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-10-16 00:00:00 UTC', 5, 'ZZZ' FROM DUAL
) from dual;
失败并出现错误:
ORA-00913
我可以尝试什么?
您将子查询用作选定列,这是允许的,但子查询必须只返回一行和一列。
所以这是一个有效的语法
select
( SELECT 'ABC' FROM DUAL )
from dual
但是您的子查询返回三行五列,这是不可接受的,并导致ORA-00913: too many values
您可以做的是在FROM
子句中使用子查询。 这是有效的语法:
INSERT INTO blah (CAT, BUSINESS_NR, TIME_A, VERSION, SOME_CODE)
select *
FROM
(
SELECT 'ABC', 123, TIMESTAMP '2009-02-19 00:00:00 UTC', 1, 'OPP' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-08-16 00:00:00 UTC', 4, 'FFF' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-10-16 00:00:00 UTC', 5, 'ZZZ' FROM DUAL
);
在这种简单的情况下(正如其他人所指出的),您可能会完全摆脱主查询。
您不需要额外的SELECT
:
INSERT INTO blah (CAT, BUSINESS_NR, TIME_A, VERSION, SOME_CODE)
SELECT 'ABC', 123, TIMESTAMP '2009-02-19 00:00:00 UTC', 1, 'OPP' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-08-16 00:00:00 UTC', 4, 'FFF' FROM DUAL UNION ALL
SELECT 'GHI', 357, TIMESTAMP '2020-10-16 00:00:00 UTC', 5, 'ZZZ' FROM DUAL;
您的查询的问题是您有返回多于一列的子查询。 SQL 通常不允许这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.