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