簡體   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