Пытаюсь обновить таблицу, но я всегда получаю ora-01427 - PullRequest
0 голосов
/ 05 июня 2019

Поэтому я пытаюсь обновить свою таблицу Vorschlagspakete некоторыми значениями, которые я получил из других таблиц. Точно есть 3 значения, которые я хочу записать в основную таблицу. АТМ это выглядит так:

update vorschlagspakete
set (paketid, verkaufsstelleid) = (
  select k.paketid, k.verkaufsstelleid
  from Konfiguration k, bewertung b
  where k.konfigurationsid = b.konfigurationsid
  group by k.paketid, k.verkaufsstelleid
  having avg(b.sterne) >= 5);

Но каждый раз, когда я пробовал это, это приводит к ora-01427.

1 Ответ

1 голос
/ 05 июня 2019

Ошибка, которую вы получили, ORA-01427, означает слишком много строк (были возвращены подзапросом). Например, на основе схемы Скотта (поскольку у меня нет ваших таблиц), это выглядит так:

SQL> update emp e set
  2    (e.ename, e.job) = (select d.dname, d.loc from dept d);
  (e.ename, e.job) = (select d.dname, d.loc from dept d)
                      *
ERROR at line 2:
ORA-01427: single-row subquery returns more than one row

Почему бы это не сработало? Потому что подзапрос возвращает более одной строки!

SQL> select d.dname, d.loc from dept d;

DNAME          LOC
-------------- -------------
ACCOUNTING     NEW YORK
RESEARCH       DALLAS
SALES          CHICAGO
OPERATIONS     BOSTON

SQL>

Итак, как бы вы поместили все эти значения в одну строку таблицы EMP? Очевидно, что это не сработает, поэтому вам нужно сделать что-то , чтобы ограничить количество строк. Как? Смотря как.

  • иногда DISTINCT помогает, например

    select distinct d.dname, d.loc from dept d
    
  • иногда помогает дополнительное WHERE условие, например

    select d.dname, d.loc from dept d
    where d.location = 'NEW YORK'
    
  • иногда помогает объединение с обновляемой таблицей, например,

    select d.dname, d.loc from dept d where d.deptno = e.deptno
    

    , что приводит к

    SQL> update emp e set
      2    (e.ename, e.job) = (select d.dname, d.loc from dept d where d.deptno =       e.deptno);
    
    14 rows updated.
    

Что делать? Я не знаю, у нас нет ваших данных. Посмотрите, поможет ли что-то написанное выше.

...