MYSQL插入+ select + CASE + delete无法正常工作

时间:2017-08-28 08:41:52

标签: mysql insert case having insert-into

我有2个相同的表DATES和DATES_ARCHIVED

我想在DATES表中选择日期早于当前日期-88天的所有行,然后将这些行插入DATES_ARCHIVED。

我为此创建了一个CASE。

然后在插入后我想从原始DATES表中删除那些相同的行。

我确信我之前已经开始工作了,但它不再起作用了它一直在给出错误:

错误代码:1136。列数与第1行的值计数不匹配

所有表都有相同数量的列,我也删除了我在表上的2个触发器,但发生了同样的错误。

我很确定这是因为它结束了AS MostRecentDate的情况,我认为这是添加一个新列。

此外,如果我删除第一个下面的所有代码:从日期开始,我会得到相同的错误

以下是代码:

INSERT INTO dates_archived

(term, course_no, date1_end, date2_end, date3_end, date4_end)

SELECT

term, course_no, date1_end, date2_end, date3_end, date4_end,

    CASE    WHEN date1_end > date2_end THEN date1_end
            WHEN date2_end > date1_end THEN date2_end
            WHEN date3_end > date1_end THEN date3_end
            WHEN date4_end > date1_end THEN date4_end

            WHEN date1_end > date3_end THEN date1_end
            WHEN date2_end > date3_end THEN date2_end
            WHEN date3_end > date2_end THEN date3_end
            WHEN date4_end > date2_end THEN date4_end

            WHEN date1_end > date4_end THEN date1_end
            WHEN date2_end > date4_end THEN date2_end
            WHEN date3_end > date4_end THEN date3_end
            WHEN date4_end > date3_end THEN date4_end

    ELSE 0

     END AS MostRecentDate

FROM dates

HAVING (MostRecentDate <= (SELECT CURDATE() - INTERVAL 88 DAY));

FROM dates

WHERE (date1_end OR date2_end OR date3_end OR date4_end = MostRecentDate);

DELETE FROM dates

WHERE (date1_end OR date2_end OR date3_end OR date4_end = MostRecentDate); 

提前致谢, 克里斯

1 个答案:

答案 0 :(得分:0)

使用CASE,您在其中添加了一个名为MostRecentDate的新行,因此行数与表行数不匹配(因为您只使用这些term, course_no, date1_end, date2_end, date3_end, date4_end在插入中)。

如果您确实需要该字段MostRecentDate,则必须将其添加到DATES_ARCHIVED表中,以便行数相同,并且您的语句将完全正常。

如果您不需要在表中插入该行,只需从代码中删除CASE语句,它就可以正常运行而不会给您带来任何错误。

同样在您的代码中,您在MostRecentDate语句中使用DELETE,但是在insert into语句完成后应删除该变量,因此代码将在那里中断。如果要在delete语句中使用它,还需要再次声明它。

我建议您创建一个变量,然后执行CASE语句将值保存在其中,只需在HAVING / WHEREDELETE中使用该变量,这样你就不必在SELECT中拥有它,代码也不会在那里破解。