#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. Ваш второй блок — это именно то, что я искал. Большое спасибо.