我想使用 union all 进行插入,它有一列从序列中获取值
Posted
技术标签:
【中文标题】我想使用 union all 进行插入,它有一列从序列中获取值【英文标题】:I want to make an insert using union all which has a column getting values from a sequence 【发布时间】:2011-11-30 13:53:30 【问题描述】:我试过了
INSERT INTO my_test_one (rollno,name, sirname, Dept)
(select rollno_seq.nextval,'name1','sirname1', Dept
FROM my_test_one_backup
WHERE dept = 500
UNION ALL
select rollno_seq.nextval,'name1','sirname1', Dept
FROM my_test_one_backup
WHERE dept = 501 );
执行此操作时出现错误
错误报告:
SQL 错误:ORA-02287:此处不允许序列号 02287. 00000 - “此处不允许序列号”
【问题讨论】:
【参考方案1】:在这种情况下不要使用UNION
,而是使用单个SELECT
和OR
:
SELECT rollno_seq.nextval,'name1','sirname1', Dept
FROM my_test_one_backup
WHERE dept = 500 OR dept = 501
【讨论】:
【参考方案2】:试试:
INSERT INTO my_test_one
(rollno, name, sirname, Dept)
SELECT rollno_seq.nextval,
name1,
sirname1,
dept
FROM (select 'name1' as name1,'sirname1' as sirname1, Dept
FROM my_test_one_backup
WHERE dept = 500
UNION ALL
select 'name1','sirname1', Dept
FROM my_test_one_backup
WHERE dept = 501 );
编辑:更好的是,使用像 CodeBrickie 所说的 OR
或和 IN
语句。
WHERE dept IN (500, 501);
编辑2:
当前您选择“name1”、“sirname1”作为文字,因此返回的每一行都将插入下一个序列号、“name1”、“sirname1”以及 DEPT 列的值。
如果您的表有名为 name1 和 sirname1 的列,那么您需要删除单引号(并且您也不需要列别名)例如:
INSERT INTO my_test_one
(rollno, name, sirname, Dept)
SELECT rollno_seq.nextval,
name1,
sirname1,
dept
FROM (select name1, sirname1, Dept
FROM my_test_one_backup
WHERE dept = 500
UNION ALL
select name1, sirname1, Dept
FROM my_test_one_backup
WHERE dept = 501 );
或者
INSERT INTO my_test_one
(rollno, name, sirname, Dept)
SELECT rollno_seq.nextval,
name1,
sirname1,
dept
FROM my_test_one_backup
WHERE dept IN (500, 501);
【讨论】:
这里有必要使用'name1'作为name1赋值吗? 我为该列设置别名,以便在外部 SELECT 中引用。 您确实意识到将字符串括在单引号中意味着它是 Oracle 中的文字?您的查询将为查询返回的每条记录选择“name1”。您是否尝试在名为 NAME1 的列中选择值?我会编辑我的答案以防万一......【参考方案3】:您不能在联合选择中使用序列,因此您需要将联合放在子查询中,将序列放在外部查询中:
INSERT INTO my_test_one (rollno,name, sirname, Dept)
select rollno_seq.nextval, name1, sirname1, dept
from (SELECT 'name1' as name1,'sirname1' as sirname1, Dept
FROM my_test_one_backup
WHERE dept = 500
UNION ALL
SELECT 'name1','sirname1', Dept
FROM my_test_one_backup
WHERE dept = 501 );
您还应该注意,在 SQL 中,双引号表示对象名称,单引号表示字符串,因此 'name1'
和 'sirname1'
将是静态字符串,而不是列引用。
【讨论】:
以上是关于我想使用 union all 进行插入,它有一列从序列中获取值的主要内容,如果未能解决你的问题,请参考以下文章