具有空值的UPDATE COALESCE查询

时间:2019-01-24 23:42:41

标签: mysql common-table-expression coalesce

绝对是一个基本问题,但我找不到示例。

我正在编写一个将两行合并为好行的过程。它将所有子行的ID移到正确的ID,并在最终删除“不良”行之前,用要删除的行中的可用值替换所有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 :(得分:1)

在此声明中:

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不为空的记录。