我正在尝试进行此更新,但出于某种原因,我无法完全掌握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
但是因为我甚至无法提出子查询,所以我无法继续:/
有人可以给我一些见解。我正在尝试真正了解有关子查询的更多信息,因此我们将非常感谢您的解释。
谢谢!
答案 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