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
中,代码也不会在那里中断。
我有 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
中,代码也不会在那里中断。