2013-02-18 57 views
1

我想要做这个更新,但由于某种原因,我不能完全掌握SQL子查询。SQL Server:最大日期上的外键更新标志

我的表结构如下:

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

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

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

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

+0

谢谢!你不仅给我答案,而且还解释了你的逻辑。我不知道“WITH”关键字,但它似乎使查询变得更加人性化! – Amartacus 2013-02-19 14:48:58

+0

是的,WITH在SQL中是相对较新的。它可以做其他有趣的事情(递归),但我觉得它是开发查询的好方法。如果你有很多的“子查询”,它可以使测试更容易,因为你可以查询链中的任何点而不改变其余的(只是注释掉最后一个查询并把它放在你想要的地方)。 – Hogan 2013-02-19 17:19:36

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 
+0

这是正确的答案,但霍根的答案是解释的“接受”答案。谢谢! – Amartacus 2013-02-19 14:50:37