Обновление таблицы с использованием объединенного SQL Oracle - PullRequest
0 голосов
/ 01 января 2019

Мне нужно обновить несколько столбцов таблицы, но одна часть информации хранится в другой таблице, поэтому я предполагаю, что мне нужно присоединиться к ним, но я не знаю, как это сделать.В основном мне нужно обновить название должности, где офис T06, и дату начала, где первоначальная дата начала была '05 -FEB-09, 08:00 'для персонала, фамилия которого Паркер

Пока что яиметь:

UPDATE JOB
SET JOB_TITLE = 'Head of Technology'
WHERE OFFICE = 'T06' 
AND SET START_DATE = '26-JUN-17, 08:00'
WHERE START_DATE = '05-FEB-09, 08:00'
FROM JOB
JOIN STAFF
ON JOB.STAFF_ID = STAFF.STAFF_ID
WHERE STAFF.LAST_NAME = 'Parker';

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Я бы использовал EXISTS:

UPDATE JOB
    SET JOB_TITLE = 'Head of Technology'
        OFFICE = 'T06',
        START_DATE = '26-JUN-17, 08:00'
WHERE START_DATE = '05-FEB-09, 08:00' AND
      OFFICE = 'T06' AND
      EXISTS (SELECT 1
              FROM STAFF
              WHERE JOB.STAFF_ID = STAFF.STAFF_ID AND
                    STAFF.LAST_NAME = 'Parker' 
             );
0 голосов
/ 01 января 2019

Наиболее естественным способом является использование обновляемого представления объединения

Просто сделайте объединение и выберите все соответствующие столбцы, чем добавьте UPDATE, изменяющее объединение.

update (
 select job.*
 FROM JOB
 JOIN STAFF
 ON JOB.STAFF_ID = STAFF.STAFF_ID
 WHERE STAFF.LAST_NAME = 'Parker')
set JOB_TITLE = 'Head of Technology',
START_DATE = '26-JUN-17, 08:00'

Единственное требование - чтобы столбец STAFF_ID в таблице STAFF был снабжен уникальным индексом (например, первичным ключом).

Без этого вы получите ОШИБКУ ORA-01779: cannot modify a column which maps to a non key-preserved table

Этот способ UPDATE очень полезен, если вам нужно обновить значение из объединенной таблицы (не ваш случай).

0 голосов
/ 01 января 2019

Правильный синтаксис:

update job
set job_title = 'Head of Technology',
    start_date = '26-JUN-17, 08:00'
where office = 'T06'
      and start_date = '05-FEB-09, 08:00'
      and staff_id =(select staff_id
                     from staff
                     where last_name = 'Parker'
                    );

Однако его может потребоваться изменить (START_DATE странное условие).

Кроме того, неясно, что такое тип данных START_DATE, Должно быть DATE, но ваш код предлагает строку (VARCHAR2).


Альтернативная функция №1 (примечание TO_DATE):

update job
set job_title = 'Head of Technology',
    start_date = to_date('26-JUN-17, 08:00', 'dd-mon-yy, hh24:mi')
where office = 'T06'
      and start_date = to_date('05-FEB-09, 08:00', 'dd-mon-yy, hh24:mi')
      and staff_id =(select staff_id
                     from staff
                     where last_name = 'Parker'
                    );

Альтернатива № 2 (примечание CASE и отсутствие START_DATE в предложении WHERE):

update job
set job_title = 'Head of Technology',
    start_date = case when start_date = to_date('05-FEB-09, 08:00', 'dd-mon-yy, hh24:mi')
                           then         to_date('26-JUN-17, 08:00', 'dd-mon-yy, hh24:mi')
                      else start_date
                 end
where office = 'T06'
      and staff_id =(select staff_id
                     from staff
                     where last_name = 'Parker'
                    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...