Я хочу сделать вставку, используя объединение все, который имеет столбец, получающий значения из последовательности - PullRequest
1 голос
/ 30 ноября 2011

Я пытался

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 - «здесь не разрешен порядковый номер»

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Не используйте UNION, а только SELECT и OR в этом случае:

SELECT rollno_seq.nextval,'name1','sirname1', Dept 
FROM my_test_one_backup 
WHERE dept = 500 OR dept = 501
3 голосов
/ 30 ноября 2011

Попробуйте:

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 ); 

Edit: еще лучше, используйте OR, как говорит CodeBrickie или и 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);
2 голосов
/ 30 ноября 2011

Вы не можете использовать последовательность в объединенных выборках, поэтому вам нужно поместить объединение в подзапрос, а последовательность во внешний запрос:

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' будут статическими строками, а не ссылками на столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...