基于 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_date
、t1
或t2
?让它明确。
【参考方案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 值,没有 ID 或键
SQL UPDATE TOP () 或 UPDATE 与 SELECT TOP
SQL Inject漏洞手工测试:基于报错的信息获取(select/delete/update/insert)