SQL Server:在外键上的最大日期更新标志

时间:2013-02-18 23:14:40

标签: sql sql-server sql-update inner-join

我正在尝试进行此更新,但出于某种原因,我无法完全掌握SQL子查询。

我的表格结构如下:

 id  fk    date     activeFlg
---  --  -------    ---------
 1   1   04/10/11      0
 2   1   02/05/99      0
 3   2   09/10/11      0
 4   3   11/28/11      0
 5   3   12/25/98      0

理想情况下,我想为所有具有最新日期的不同外键设置activeFlg为1。例如,在运行我的查询后,id 1,3和4将有一个活动标志设置为1。

我想出的最接近的事情是返回每个不同fk的所有最大日期的查询:

SELECT MAX(date)
FROM table
GROUP BY fk

但是因为我甚至无法提出子查询,所以我无法继续:/

有人可以给我一些见解。我正在尝试真正了解有关子查询的更多信息,因此我们将非常感谢您的解释。

谢谢!

2 个答案:

答案 0 :(得分:0)

你需要选择fk然后再限制,所以

SELECT fk,MAX(date)
FROM table
GROUP BY fk

With Ones2update AS
(
  SELECT fk,MAX(date)
  FROM table
  GROUP BY fk
)
Update table
  set Active=1
from table t
join Ones2update u ON t.fk = u.fk and t.date = u.date

我也会先测试一下这个查询

With Ones2update AS
(
  SELECT fk,MAX(date)
  FROM table
  GROUP BY fk
)
selct fk, date, active 
from table t
join Ones2update u ON t.fk = u.fk and t.date = u.date

确保你得到你所期望的,我没有做任何错别字。

附加说明:我使用连接而不是子查询 - 它们在逻辑上是相同的但我总是发现连接更清楚(一旦我习惯使用连接)。根据优化器,它们可以更快。

答案 1 :(得分:0)

这是一般的想法。你可以充实细节。

update t
set activeFlg = 1
from yourTable t
join (
select id, max([date] maxdate
from TheForeignKeyTable
group by [date]
)  sq on t.fk = sq.id and t.[date] = maxdate