Обновление Oracle с вложенным выбором с несколькими объединениями - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь написать скрипт, который включает в себя запрос Oracle, чтобы обновить запланированную дату завершения проекта до пересмотренной даты окончания, которая была отправлена ​​через запрос на изменение, но дата не обновляется при запуске скрипта.

Я не уверен, является ли это проблемой с моим запросом или чем-то еще. Прежде чем я углублюсь, этот запрос выглядит так, как будто он должен работать? (В настоящее время я не могу проверить запрос к самой базе данных.)

UPDATE Project pr
SET pr.ScheduledFinish = (SELECT ch.RevisedEndDate
                          FROM Change ch
                          JOIN ChangeRequests cr ON cr.ID = ch.ID
                          JOIN RisksAndIssues ri ON ri.ID = cr.ID
                          JOIN Project pr ON pr.ID = ri.PK_ID
                          WHERE pr.ID = ?)
WHERE pr.ID = (SELECT ID
               FROM Change ch
               WHERE ch.ID = ?)

Примечание:? в запросе есть переменная связывания, которая будет принимать значение записи, над которой в данный момент работает. то есть. Если запрос на изменение, для которого выполняется запрос, имеет идентификатор 1214, то? будет 1214 после запуска сценария.

Заранее спасибо.

Обновление:

Я считаю, что это правильная логика:

UPDATE Project pr
SET pr.ScheduledFinish = (SELECT ch.RevisedEndDate
                          FROM Change ch
                          JOIN ChangeRequests cr ON cr.ID = ch.ID
                          JOIN RisksAndIssues ri ON ri.ID = cr.ID
                          JOIN Project pr ON pr.ID = ri.PK_ID
                          WHERE pr.ID = ?)
WHERE pr.ID = (SELECT ID
               FROM RisksAndIssues ri
               JOIN ChangeRequests cr ON cr.ID = ri.ID
               JOIN Change ch ON ch.ID = cr.ID
               JOIN Project pr ON pr.ID = ri.PK_ID
               WHERE pr.ID = ?)

Гордон, ты был прав. Я пытался сопоставить идентификатор изменения с идентификатором проекта, но они не коррелируют. Таким образом, этот новый подвыбор в предложении WHERE обновления должен исправить проблему связывания.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019
UPDATE Project pr
SET pr.ScheduledFinish = (SELECT ch.RevisedEndDate
                          FROM Change ch
                          JOIN ChangeRequests cr ON cr.ID = ch.ID
                          JOIN RisksAndIssues ri ON ri.ID = cr.ID
                          JOIN Project pr ON pr.ID = ri.PK_ID
                          WHERE pr.ID = ?)
WHERE pr.ID = (SELECT ID
               FROM RisksAndIssues ri
               JOIN ChangeRequests cr ON cr.ID = ri.ID
               JOIN Change ch ON ch.ID = cr.ID
               JOIN Project pr ON pr.ID = ri.PK_ID
               WHERE pr.ID = ?);

Есть несколько проблем с вашим запросом - для начала, вы не связали столбец идентификатора во втором подзапросе - какой идентификатор вы ищете? пр, ч, ри, ...? Кроме того, у вас есть ненужное присоединение к project в ваших подзапросах; Вы можете соотнести это с таблицей, которую вы обновляете, поскольку это та же самая таблица.

Вы можете переписать это примерно так:

UPDATE Project pr
SET pr.ScheduledFinish = (SELECT ch.RevisedEndDate
                          FROM Change ch
                          INNER JOIN ChangeRequests cr ON cr.ID = ch.ID
                          INNER JOIN RisksAndIssues ri ON ri.ID = cr.ID
                          WHERE ri.PK_ID = pr.ID)
WHERE pr.ID = ?
AND   EXISTS (SELECT NULL
               FROM RisksAndIssues ri
               JOIN ChangeRequests cr ON cr.ID = ri.ID
               JOIN Change ch ON ch.ID = cr.ID
               WHERE ri.pk_id = pr.ID);

Или, что еще лучше, вы можете избежать повторения подзапроса с помощью оператора MERGE, например ::

MERGE INTO project tgt
  USING (SELECT ri.pk_id,
                ch.revisedenddate
         FROM   CHANGE ch
         INNER JOIN ChangeRequests cr ON cr.ID = ch.ID
         INNER JOIN RisksAndIssues ri ON ri.ID = cr.ID
         WHERE  ri.pk_id = ?) src
    ON (tgt.id = src.pk_id)
WHEN MATCHED THEN
  UPDATE SET tgt.scheduledfinish = src.revisedenddate;
0 голосов
/ 30 мая 2019

Вероятно, нет change.id, который соответствует вашему проекту.Весьма подозрительно, что все столбцы JOIN называются ID.Я ожидал бы чего-то большего, как это:

Разве это не выражает ту логику, которую вы хотите?

UPDATE Project pr
SET pr.ScheduledFinish = (SELECT ch.RevisedEndDate
                          FROM Change ch JOIN
                               ChangeRequests cr
                               ON cr.ID = ch.ChangeID JOIN
                               RisksAndIssues ri
                               ON ri.ID = cr.RiskID
                          WHERE ri.ProjectID = pr.ID
                         )
WHERE pr.ID = (SELECT ch.projectID
               FROM Change ch
               WHERE ch.ID = ?
              )

Однако я не знаю фактических имен столбцов в вашей таблице,так что это всего лишь предположение.

Обратите внимание, что это удаляет ссылку Project в подзапросе.

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