INSERT … SELECT :缺少 SELECT 关键字
INSERT … SELECT : missing SELECT keyword
我正在尝试使用递归 CTE 将字符串拆分为多个值。然后将数据插入另一个 table.
以下在 PostgreSQL 中有效:
CREATE TABLE test(data varchar(255));
WITH RECURSIVE
cte(genres) AS (SELECT 'apple,banana,cherry,date'),
split(genre,rest,genres) AS (
SELECT '', genres||',',genres FROM cte
UNION ALL
SELECT
substring(rest,0,position(',' IN rest)),
substring(rest,position(',' IN rest)+1),
genres
FROM split WHERE rest<>''
)
INSERT INTO test(data)
SELECT genre
FROM split;
然而,Oracle 版本:
CREATE TABLE test(data varchar(255));
WITH
cte(genres) AS (SELECT 'apple,banana,cherry,date' FROM dual),
split(genre,rest,genres) AS (
SELECT '', genres||',',genres FROM cte
UNION ALL
SELECT
substr(rest,1,instr(rest,',')-1),
substr(rest,instr(rest,',')+1),
genres
FROM split WHERE rest IS NOT NULL
)
INSERT INTO test(data)
SELECT genre
FROM split WHERE genre IS NOT NULL;
给我错误信息:
ORA-00928: missing SELECT keyword.
现在我很确定我有一个,在 INSERT
和下面的 FROM
之间。
注释掉INSERT
,剩下的就给出结果了。在其他地方,我知道一个简单的 INSERT … SELECT
确实有效。
与递归CTE有关吗?如何使用标准递归 CTE 使其正常工作?
在 Docker 映像中使用 Oracle 18c。这里有一个fiddle:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=d24f3105634933af1b7072bded1dacdf .
INSERT-SELECT 表示首先是“INSERT”命令,然后是 SELECT 部分,WITH 是 SELECT 的一部分而不是插入。
SQL> create table t ( x int );
Table created.
SQL> with blah as ( select 1 c from dual)
2 insert into t
3 select * from blah;
insert into t
*
ERROR at line 2:
ORA-00928: missing SELECT keyword
SQL> insert into t
2 with blah as ( select 1 c from dual)
3 select * from blah;
1 row created.
我正在尝试使用递归 CTE 将字符串拆分为多个值。然后将数据插入另一个 table.
以下在 PostgreSQL 中有效:
CREATE TABLE test(data varchar(255));
WITH RECURSIVE
cte(genres) AS (SELECT 'apple,banana,cherry,date'),
split(genre,rest,genres) AS (
SELECT '', genres||',',genres FROM cte
UNION ALL
SELECT
substring(rest,0,position(',' IN rest)),
substring(rest,position(',' IN rest)+1),
genres
FROM split WHERE rest<>''
)
INSERT INTO test(data)
SELECT genre
FROM split;
然而,Oracle 版本:
CREATE TABLE test(data varchar(255));
WITH
cte(genres) AS (SELECT 'apple,banana,cherry,date' FROM dual),
split(genre,rest,genres) AS (
SELECT '', genres||',',genres FROM cte
UNION ALL
SELECT
substr(rest,1,instr(rest,',')-1),
substr(rest,instr(rest,',')+1),
genres
FROM split WHERE rest IS NOT NULL
)
INSERT INTO test(data)
SELECT genre
FROM split WHERE genre IS NOT NULL;
给我错误信息:
ORA-00928: missing SELECT keyword.
现在我很确定我有一个,在 INSERT
和下面的 FROM
之间。
注释掉INSERT
,剩下的就给出结果了。在其他地方,我知道一个简单的 INSERT … SELECT
确实有效。
与递归CTE有关吗?如何使用标准递归 CTE 使其正常工作?
在 Docker 映像中使用 Oracle 18c。这里有一个fiddle:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=d24f3105634933af1b7072bded1dacdf .
INSERT-SELECT 表示首先是“INSERT”命令,然后是 SELECT 部分,WITH 是 SELECT 的一部分而不是插入。
SQL> create table t ( x int );
Table created.
SQL> with blah as ( select 1 c from dual)
2 insert into t
3 select * from blah;
insert into t
*
ERROR at line 2:
ORA-00928: missing SELECT keyword
SQL> insert into t
2 with blah as ( select 1 c from dual)
3 select * from blah;
1 row created.