2012-05-02 86 views
-2

我有兩列這樣的:如何比較在同一列中重複的值?

ChannelURI UserId 
1020   1 
1040   2 
1060   3 
1020   5 
1090   4 
1020   5 

現在我要檢查是否有任何以前行的條目有最後一行的最後一個值,如果是這樣,它具有相同的用戶ID,然後跳過,如果發現(匹配),並用不同的用戶id,然後在這種情況下user ID =1插入空在ChannelUri

應該有channeluri設置爲null

任何想法如何實現這一目標?

+6

你說的「以前」和「最後」是什麼意思?這些詞假定你有一個訂單。你訂購了哪一列? –

+0

當你說「在ChannelUri插入空」你的意思是在查詢返回的值,或真正地改變數據在表中的答案有一個(合理的)假設? – hatchet

回答

2

SQL認爲數據是一組無序。除非您指定ORDER BY,否則行可合法地以任何順序返回。

除非你也有另一場(S),你可以通過訂購您的數據,「之前的紀錄」實際上可能是任何東西。


可以只是選擇所有的數據,並解析它在PHP或.Net,對不對? 沒有。

僅僅因爲數據通常回來以相同的順序,這是從來沒有保證。更改數據,上盤,索引,並行數據等諸多因素的破碎意味着數據可以在任何時間以不同的順序返回。


如果你的邏輯是依賴於數據的順序,你必須指定 ORDER BY子句等,通過暗示,必須在數據字段,使您可以訂購。

對不起。

2

假設你有一列'Sort',你可以使用命令你行的,下面的語句會做的伎倆:

UPDATE m 
SET ChannelURI = NULL 
FROM mytable m 
JOIN mytable m2 
    ON m.ChannelURI = m2.ChannelURI 
    AND m.UserId != m2.UserId 
    AND m2.Sort = (SELECT MAX(sort) FROM mytable) 
+1

@Dems怎麼樣? http://sqlfiddle.com/#!3/7be73/8 – erikxiv

+0

+1:但是,如果你的假設是真的,我想* *,這需要'AND m2.sort =(SELECT MAX(排序)FROM MYTABLE)'或相當於...'檢查是否有任何以前的行條目有最後row' *的最後一個值[重要部分是'最後row'。*雖然我不是100%肯定。 – MatBailie

+0

@Dems真的,我已經更新了答案。我的版本將確保ChannelURI對每個用戶都是唯一的,而不關心OP詢問的最後一行。 – erikxiv

0

基本上,這採用了相同的想法@erikxiv's answer,但使用SELECT TOP (1)來檢索最後一排,而不是過濾功能MAX(sort)

UPDATE m 
SET ChannelURI = NULL 
FROM mytable m 
JOIN (
    SELECT TOP (1) ChannelURI, UserId 
    FROM mytable 
    ORDER BY sort DESC 
) last 
    ON m.ChannelURI = last.ChannelURI 
    AND m.UserId != last.UserId 
相關問題