基于 TOP 的 SQL UPDATE

Posted

技术标签:

【中文标题】基于 TOP 的 SQL UPDATE【英文标题】:SQL UPDATE based on TOP 【发布时间】:2019-07-24 00:06:51 【问题描述】:

我需要根据另一个表中的日期字段更新日期字段,我被告知它将在两个字段上是唯一的:dept_no 和 unit。

所以我这样做了,效果很好:

UPDATE t1
SET t1.record_date =  SELECT TOP 1 t2.record_date
FROM     jkyearly t1
    INNER JOIN yearly_inspection t2 ON (t1.dept_no = t2.dept_no AND t1.unit = t2.unit) ORDER BY record_date DESC

但是现在,我发现客户给了我错误的信息(很震惊,对吧?)。对于每个 dept_no + unit 组合,yearly_inspection 中有多个记录,但我需要为每个组合填写最新日期。所以我尝试了这个:

UPDATE jkyearly
SET record_date =
  (SELECT TOP (1) record_date
   FROM            yearly_inspection AS t2
   WHERE        (dept_no = dept_no) AND (unit = unit)
   ORDER BY record_date DESC)

嗯,它更新了字段,但所有内容只有一个最新日期。我需要每个 dept_no + unit 组合的最新日期。

谁能帮忙?

【问题讨论】:

请添加一些示例数据。 order by 哪个record_datet1t2?让它明确。 【参考方案1】:

您需要一个相关的子查询。您需要限定 所有 列引用,因此:

UPDATE jkyearly
    SET record_date = (SELECT TOP (1) yi.record_date
                       FROM yearly_inspection yi
                       WHERE yi.dept_no = jkyearly.dept_no AND
                             yi.unit = jkyearly.unit
                       ORDER BY record_date DESC
                      );

【讨论】:

谢谢!这就是答案。我几乎拥有它,但没有正确设置别名。【参考方案2】:

使用此代码

UPDATE jkyearly
SET record_date =
  (SELECT DISTINCT MAX(t2.record_date)
   FROM            yearly_inspection AS t2
   WHERE        (dept_no = dept_no) AND (unit = unit))

【讨论】:

这为所有记录提供相同的最高日期。上面的评论就是答案。

以上是关于基于 TOP 的 SQL UPDATE的主要内容,如果未能解决你的问题,请参考以下文章

sql UPDATE COLUMN基于其他列

基于行和列位置的 SQL UPDATE 值,没有 ID 或键

SQL UPDATE TOP () 或 UPDATE 与 SELECT TOP

SQL Inject漏洞手工测试:基于报错的信息获取(select/delete/update/insert)

SQL Server Update:使用 TOP 限制更新的数据

SQL Update TOP Update Order by 和output的使用