Oracle — обновление таблицы на основе поля из другой таблицы

#oracle #sql-update #subquery #correlated-subquery

#Oracle #sql-обновление #подзапрос #коррелированный -подзапрос

Вопрос:

У меня есть таблица задач и таблица проекта. Я пытаюсь обновить поле процента заполнения в таблице Проекта значением поля процента заполнения из таблицы задач. Но я хочу обновлять поле только тогда, когда код последовательности из таблицы задач равен 1. Моя неудачная попытка выглядит так:

 UPDATE inv_projects prj
SET prj.percent_complete = (SELECT NVL(tsk.prpctcomplete, 0)
                            FROM prtask tsk
                            WHERE tsk.prprojectid = prj.prid)
WHERE (SELECT tsk.prwbssequence
       FROM prtask tsk
       WHERE prj.prid = tsk.prprojectid) = 1;
  

Я получаю сообщение об ошибке:

 Error starting at line : 1 in command -
...
Error report -
ORA-01427: single-row subquery returns more than one row
  

Я не совсем уверен, что происходит не так.

Ответ №1:

Предположительно, вам нужна фильтрация последовательности в подзапросе, например

 UPDATE inv_projects prj
SET prj.percent_complete = (
    SELECT NVL(tsk.prpctcomplete, 0)
    FROM prtask tsk
    WHERE tsk.prprojectid = prj.prid AND sk.prwbssequence = 1
)
  

Предполагается, что (prprojectid, prwbssequence) это уникально в таблице задач, что, по-видимому, согласуется с вашей постановкой задачи.

Если есть проекты без задачи последовательности 1 , и вы не хотите их обновлять, используйте exists :

 UPDATE inv_projects prj
SET prj.percent_complete = (
    SELECT NVL(tsk.prpctcomplete, 0)
    FROM prtask tsk
    WHERE tsk.prprojectid = prj.prid AND sk.prwbssequence = 1
)
WHERE EXISTS (
    SELECT 1
    FROM prtask tsk
    WHERE tsk.prprojectid = prj.prid AND sk.prwbssequence = 1
)
  

Или, может быть, ваше намерение состоит в том, чтобы установить процент завершения 0 в этом случае; если это так, переместитесь NVL() за пределы подзапроса:

 UPDATE inv_projects prj
SET prj.percent_complete = NVL(
    (
        SELECT tsk.prpctcomplete
        FROM prtask tsk
        WHERE tsk.prprojectid = prj.prid AND sk.prwbssequence = 1
    ),
    0
)
  

Комментарии:

1. Ваш второй блок — это именно то, что я искал. Большое спасибо.