2016-04-06 2 views
0

Я столкнулся с этим сценарием: столбец Employee имеет столбец joining_date. Для резервирования таблиц для Employee используется столбец «book_date» и внешний ключ (employee_id). У сотрудника есть несколько значений NULL в столбце joining_date. Я хочу заполнить их значением FIRST booking_date для этих сотрудников. Как я могу сделать?Oracle - обновить строки с минимальным значением в группе столбца из другой таблицы

FYI: Я могу запросить с комплексом присоединиться к отчетности, чтобы извлечь первую booking_date сотрудников, чьи joining_date является NULL, как показано ниже:

SELECT emp.employee_id, emp.joining_date, temp2.booking_date FROM employee emp 
    LEFT JOIN (SELECT bo.employee_id, bo.booking_date FROM booking bo 
    INNER JOIN (SELECT employee_id, MIN(booking_date) mindate FROM booking GROUP BY employee_id) temp1 
    ON bo.employee_id = temp1.employee_id AND bo.booking_date = temp1.mindate) temp2 
    ON emp.employee_id = temp2.employee_id 
WHERE emp.joining_date IS NULL; 

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

UPDATE employee emp 
SET emp.joining_date = (SELECT ...) 
WHERE emp.joining_date IS NULL; 

ответ

0

Ваш оператор выбора является более сложной, чем она должна быть, вы получите тот же набор так:

SELECT emp.employee_id,min(bo.booking_date) booking_date 
FROM employee emp 
    LEFT JOIN booking bo 
    ON bo.employee_id = emp.employee_id 
WHERE emp.joining_date is NULL 
GROUP BY emp.employee_id; 

Ваше обновление может быть выполнено следующим образом: обратите внимание, что раздел «и существует» является необязательным, но я склонен включать его, чтобы сделать запрос более понятным.

UPDATE employee emp 
    SET emp.joining_date = 
    (SELECT min(booking_date) from booking bo where bo.employee_id = emp.employee_id) 
WHERE emp.joining_date IS NULL 
    and exists(select * from booking bo where bo.employee_id = emp.employee_id); 
Смежные вопросы