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