繁体   English   中英

SQL 通过 select 从双表插入表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM