2013-02-18 64 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