Подзапрос с одной строкой возвращает более одной строки в Oracle

Я относительно новичок в Oracle SQL, и у меня есть задание для курса приложений баз данных, который я прохожу, где часть задания состоит в передаче некоторых данных (empno, Bonus_date, job, sal и comm) из одной таблицы в другую с использованием SQL в командной строке.

Для передачи данных я использую подзапросы, а также функцию to_date() (в присваиваниях указано вставлять текущую дату в новую таблицу по мере ее добавления в дополнение к данным из старой таблицы), но продолжайте получать следующую ошибку:

ERROR at line 2:
ORA-01427: single-row subquery returns more than one row

Я отправил электронное письмо своему профессору, который предположил, что ошибка могла быть результатом лишнего пробела в моей функции to_date(), но после ее изменения ошибка все еще сохраняется.

Я также пытался изменить форматирование подзапросов, но тоже безрезультатно. Вот две таблицы, с которыми я работаю (emp — старая таблица, а emp_hist — новая таблица):

Таблица emp (старая):

 desc emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              CHAR(10)
 JOB                                                CHAR(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                    NOT NULL NUMBER(2)

Таблица emp_hist (новая):

desc emp_hist;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 BONUS_DATE                                NOT NULL DATE
 JOB                                                CHAR(9)
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)

Вот запросы (и сообщения об ошибках), которые я использовал и получал:

SQL> insert into emp_hist(empno,bonus_date,job,sal,comm)
  2  values((select empno from emp),(to_date('10/05/2015','mm/dd/yyyy')),
  3  (select job from emp),(select sal from emp),(select comm from emp));
values((select empno from emp),(to_date('10/05/2015','mm/dd/yyyy')),
       *
ERROR at line 2:
ORA-01427: single-row subquery returns more than one row 

Любое понимание этого будет с благодарностью! Если нужна дополнительная информация, пожалуйста, дайте мне знать, и я сделаю все возможное, чтобы предоставить ее!

Спасибо!


person Jamiemcg    schedule 06.10.2015    source источник
comment
MySQL, SQL Server и Oracle — это 3 разные технологии баз данных. Редко, когда вопрос должен быть помечен более чем 1. Если вы работаете в Oracle, удалите теги MySQL и SQL Server.   -  person jpmc26    schedule 06.10.2015
comment
@ jpmc26 Приношу свои извинения за добавление вводящих в заблуждение тегов к моему сообщению. Это был мой первый вопрос на этом сайте, поэтому прошу прощения за это. Спасибо, что дал мне знать!   -  person Jamiemcg    schedule 08.10.2015


Ответы (1)


Если вы только изучаете Oracle, вам действительно не нужен insert . . . values(). Более мощное утверждение — insert . . . select. Вы пытаетесь сделать следующее:

insert into emp_hist(empno, bonus_date, job, sal, comm)
    select empno, to_date('10/05/2015','mm/dd/yyyy'), job, sal, comm
    from emp;
person Gordon Linoff    schedule 06.10.2015
comment
И если цель состоит в том, чтобы вставить текущую дату, а не жестко закодированную дату 5 октября 2015 года в полночь, to_date('10/05/2015', 'mm/dd/yyyy') должно быть просто sysdate (если вы хотите текущее время) или trunc(sysdate), если вы хотите, чтобы компонент времени был полночью. - person Justin Cave; 07.10.2015
comment
Спасибо Гордону и Джастину за помощь! Я признателен за это! - person Jamiemcg; 08.10.2015
comment
@Jamiemcg Чтобы объяснить исходную ошибку, это связано с тем, что синтаксис INSERT ... VALUES можно использовать только для вставки одной строки. Поэтому, когда вы используете (select empno from emp) в качестве одного из значений столбца, Oracle исключает этот запрос, чтобы получить единственное значение, которое он может использовать. - person jpmc26; 08.10.2015
comment
@ jpmc26 А, хорошо! Спасибо за пояснение! В итоге я заставил его работать, используя синтаксис insert into и select, а также используя ключевое слово sysdate для вставки текущей даты в базу данных. . Я ценю вашу помощь! - person Jamiemcg; 12.10.2015