使用空值更新 COALESCE 查询

UPDATE COALESCE query with null values

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

我正在编写一个程序,将两行合并到好的行中。它将所有子行的 ID 移动到正确的 ID,在最终删除 'bad' 行之前,用要删除的行中的可用值替换所有 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 和合并函数的方式存在问题,但我不确定我的理解差距在哪里。

在此声明中:

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 部分使用它,因此您无法访问它的列:for MySQL, bad_employee_values.employment_date 未知。

看来您可以在这里简单地避免 CTE。您可以像这样自行加入 table:

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

此查询将简单地 select 由 @core_emp_id 标识的记录,将其与相应的 "bad" 记录连接起来,并复制 employment_date 的值。 WHERE 子句中的第二个条件防止 employment_date 不为空的记录被 selected。