绝对是一个基本问题,但我找不到示例。
我正在编写一个将两行合并为好行的过程。它将所有子行的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和合并功能存在问题,但是我不确定我的理解力在哪里。
答案 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
不为空的记录。