【问题标题】:MYSQL insert into + select + CASE + delete not workingMYSQL插入+选择+案例+删除不起作用
【发布时间】:2017-08-28 08:41:52
【问题描述】:

我有 2 个相同的表 DATES 和 DATES_ARCHIVED

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

我为此创建了一个 CASE。

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

我确定我以前可以使用它,但是它不再起作用了,它一直报错:

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

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

我很确定这是因为它以 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); 

提前致谢, 克里斯

【问题讨论】:

  • 您选择 7 列并插入到 6 列中
  • 另外你不能在 where 子句中使用你在 select 子句中定义的别名。
  • 你的删除语句应该如何知道 MostRecentDate?
  • 我猜 CASE 语句不起作用。你应该写WHEN date1_end &gt;= date2_end AND date1_end &gt;= date3_end AND date1_end &gt;= date4_end THEN date1_end
  • 好的,所以删除语句必须在另一个查询中?

标签: mysql insert case having insert-into


【解决方案1】:

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

如果您确实需要该字段 MostRecentDate,则必须将其添加到 DATES_ARCHIVED 表中,这样行数相同,您的语句才能正常工作。

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

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

我建议你创建一个变量并执行CASE 语句来保存其中的值,然后在HAVING / WHEREDELETE 中使用该变量,这样你就不会必须将它放在SELECT 中,并且代码也不会在那里中断。

【讨论】:

  • 是的,我在 dates_archived 中也添加了 MostRecentDate,它添加了行,但不会从日期中删除它们。删除部分我会回答上面的cmets。
  • 我也刚刚编辑了删除的答案。希望我能帮到你,祝你有美好的一天。
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2012-07-01
相关资源
最近更新 更多