1

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

但是由于我什至无法提出子查询,所以我无法继续:/

有人可以给我一些见解。我正在尝试真正了解有关子查询的更多信息,因此将不胜感激。

谢谢!

4

2 回答 2

0

您需要选择 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

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

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

于 2013-02-18T23:18:16.633 回答
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
于 2013-02-18T23:50:37.420 回答