我想使用 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,而是使用单个SELECTOR

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 进行插入,它有一列从序列中获取值的主要内容,如果未能解决你的问题,请参考以下文章

Union all和Union差别

使用 Union/Union All 插入无法插入所有行

尝试使用 UNION ALL 插入临时表

oracle sql union all 合并多列

通过在Oracle中分组一列从表中选择数据

根据唯一记录 postgres 将一列从一个 sql 表传输到另一列