UPDATE COALESCE запрос с нулевыми значениями - PullRequest
0 голосов
/ 25 января 2019

Определенно основной вопрос, но я не смог найти пример.

Я пишу процедуру, которая объединяет две строки в хорошую строку. Он перемещает идентификаторы всех дочерних строк в правильные, заменяет все значения NULL доступными значениями в удаляемой строке перед окончательным удалением «плохой» строки.

То, что я имею до сих пор, это:

CREATE DEFINER=`danielv`@`%` 
PROCEDURE `emp_merge`(IN `@core_emp_id` int, IN `@bad_emp_id` int)
BEGIN
    UPDATE claim SET employee_id = @core_emp_id 
    WHERE employee_id = @bad_emp_id;

    WITH bad_employee_values AS (
        SELECT * FROM employee WHERE employee_id = @bad_emp_id
    )
    UPDATE employee SET 
            employee.employment_date = COALESCE(employee.employment_date, bad_employee_values.employment_date),
    WHERE employee_id = @core_emp_id;

    DELETE FROM employee WHERE employee_id = @bad_emp_id;

END

Однако я получаю неописуемые сообщения об ошибках и не знаю почему. Я подозреваю, что есть проблема с тем, как я обращаюсь с моей CTE и функцией объединения, но я не уверен, где разрыв в моем понимании.

1 Ответ

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

В этом выражении:

WITH bad_employee_values AS (SELECT * FROM employee WHERE employee_id = @bad_emp_id)
UPDATE employee SET 
        employee.employment_date = COALESCE(employee.employment_date, bad_employee_values.employment_date),
WHERE employee_id = @core_emp_id;

Вы определяете CTE bad_employee_values, но не используете его в части запроса UPDATE, поэтому вы не можете получить доступ к его столбцам: для MySQL bad_employee_values.employment_date неизвестно.

Похоже, вы могли бы просто избежать CTE здесь.Вы можете просто самостоятельно присоединиться к таблице, например, так:

UPDATE employee e_core
INNER JOIN employee e_bad ON e_bad.employee_id = @bad_emp_id
SET e_core.employment_date = e_bad.employment_date,
WHERE employee_id = @core_emp_id AND e_core.employment_date IS NULL

Этот запрос просто выберет запись, обозначенную @core_emp_id, объединит ее с соответствующей «плохой» записью и скопирует значение employment_date.Второе условие в предложении WHERE запрещает выбор записей, для которых employment_date не равно нулю.

...