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



我正在尝试进行此更新,但由于某些原因,我无法完全掌握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

但由于我甚至无法提出子查询,因此我无法继续:/

有人能给我一些见解吗。我正在努力了解更多关于子查询的信息,如有解释,不胜感激。

谢谢!

您需要选择fk-to,然后以此进行限制,因此

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

以确保你得到了你所期望的,并且我没有拼写错误。

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

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

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

最新更新