【问题标题】:How to update record with the closest date from SQL database?如何使用 SQL 数据库中最近的日期更新记录?
【发布时间】:2016-04-14 08:37:42
【问题描述】:

我正在尝试更新一列以在日期几乎是实际日期的记录中进行培训,并且此选择工作正常:

SELECT MIN(training_id) AS training_id, date FROM training_terms WHERE 
date > CURRENT_DATE GROUP BY training_id

它会为每次培训提取最接近的日期,我想更新此选择中的“可见性”列,所以我尝试编写这样的语句:

UPDATE training_terms SET visible='1' IN (SELECT MIN(training_id) 
AS training_id, date FROM training_terms WHERE date > CURRENT_DATE GROUP BY training_id);

但随后该错误出现在控制台(Linux)中:

You can't specify target table 'training_terms' for update in FROM clause

【问题讨论】:

  • 您在这里使用的是 MySQL 还是 MS SQL Server?不要标记未涉及的产品。
  • 你为什么用Min(training_id)? It is not necessary, because of GROUP BY`,你不聚合行...

标签: mysql sql


【解决方案1】:

UPDATE 中使用FROM 是错误的。

试试这个:

UPDATE training_terms
SET visible='1'
WHERE training_id IN
(SELECT training_id FROM (SELECT training_id, MIN(Abs(date - CURRENT_DATE))
FROM training_terms
WHERE date > Getdate()
GROUP BY training_id) AS t);

我们使用子请求为每个 ID 选择日期和今天之间有最小差异的那个(所以最接近) 我们使用Abs() 确保在所有情况下都选择最接近的(未来或过去的日期)

【讨论】:

  • 谢谢,这很好,但我也必须区分重复项,例如,如果我得到 training_id 123 并且两个术语是实际的(04-20 和 05-20),那么这个声明(你的)将更新两个术语,我需要它只更新一个日期,最接近的一个
  • 所以使用子请求: UPDATE training_terms SET visible='1' WHERE training_id IN (SELECT training_id, MIN(Day(date) - Day(CURRENT_DATE)) FROM training_terms WHERE date > Getdate() GROUP BY培训ID); (我编辑我的帖子)
  • 我正在使用 MySQL,所以我用 NOW() 而不是 Getdate() 尝试了您编辑的更新语句,但仍然无法正常工作 'Operand should containt 1 column(s)' :(跨度>
  • 是的,我又搞错了!抱歉...当您使用WHERE something IN (sub_request) 时,子请求应该只有一列...但是我们还必须选择MIN...所以我建议将子请求与其他列包围起来。我再次编辑我的帖子
  • 和@dante 你想只选择未来的日期吗?如果不是这样,只需删除WHERE 子句
【解决方案2】:

以下脚本适用于 sql server 。我将 Current_Date 更改为 Getdate()

 UPDATE training_terms
    SET visible='1' 
    FROM training_terms
    WHERE training_id
    IN (SELECT MIN(training_id) 
    AS training_id FROM training_terms WHERE date > Getdate() GROUP BY training_id);

【讨论】:

  • 我们真的需要使用子请求吗?我认为只使用SELECTWHERE 子句...
  • 但 op 需要最小 id
  • 另外,我不认为Min(training_id) 有用,因为GROUP BY...行没有聚合...
  • @Vinect,我想以此区分重复项,如果我在没有 min(training_id) 的情况下编写此代码,那么它将为一个 training_id 提取两个日期,我已经检查过了
  • 您有重复的 ID?奇怪......但在这种情况下你可能只需要GROUP BY,但不需要MIN(抱歉编辑,我误解了这个问题......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多