MYSQL 插入 + select + CASE + 删除无效

MYSQL insert into + select + CASE + delete not working

我有 2 个相同的 table 日期和 DATES_ARCHIVED

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

我为此创建了一个 CASE。

然后在插入之后我想从原始 DATES table.

中删除那些相同的行

我确信我之前已经让这个工作了,但它不再工作了,它一直报错:

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

所有 table 都有相同数量的列,我还删除了 table 上的 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); 

提前致谢, 克里斯

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

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

如果您不需要将该行插入到 table 中,只需从代码中删除 CASE 语句,它应该可以正常工作而不会给您任何错误。

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

我建议您创建一个变量并执行 CASE 语句以将值保存在其中,然后在 HAVING / WHERE 和 [=17 中使用该变量=],这样你就不必将它放在 SELECT 中,代码也不会在那里中断。