2015-08-27 89 views
0

我有一張表,我只想從中選擇一列行ID,但是按特定的順序。然後,我要遍歷該列象下面這樣:我如何循環訪問for循環和數組的SQL結果?

for (i=0; i<rows.length; i++) 
{ 
    if(i==rows.length-1) 
    UPDATE myTable SET nextID = NULL WHERE ID = rows[i] 
    ELSE 
    UPDATE myTable SET nextID = rows[i+1] WHERE ID = rows[i] 
} 

我只是不知道如何與這樣的一個索引來訪問我的select語句的結果。有沒有辦法在SQL Server中做到這一點?

+2

你想** [CURSOR](https://msdn.microsoft.com/en-us/library/ms180169.aspx)**,但我強烈建議重新考慮它並找到基於SET的解決方案,而不是基於ROW。循環播放(CURSOR)是最後的手段,當一切都失敗時。 – lad2025

+2

在循環內部執行'update'可能是錯誤的方法。你只想編寫一個好的'update'語句。如果顯示提取要更新的行的'select'語句,則可以確保您得到準確的答案。 – sstan

+0

這是什麼語言?它看起來像PHP?請適當標記。 – Parfait

回答

1

既然你沒有提供很多細節,讓我們假裝你的表看起來像這樣的部分:

create table MyTable (
    Id int not null primary key, 
    Name varchar(50) not null, 
    NextId int 
) 

我想從中只選擇行標識的單個列,但在一個特定的順序

遠的不說,在這種情況下,你決定訂購RO按字母順序排列由Name。因此,讓我們假裝要遍歷看起來像這樣的select聲明:

select Id 
    from MyTable 
order by Name 

既然如此,而不是通過行循環,並嘗試使用您所提供的僞代碼更新每行,你可以用一個update語句將執行完全相同的工作,更換了整個事情:

with cte as (
    select *, 
     NewNextId = lead(Id) over (order by Name) 
    from MyTable 
) 
update cte 
    set NextId = NewNextId 

只要確保調整order by子句無論你特定的順序確實是。在我的例子中,我只使用了Name,但在你的情況下它可能是別的。

1

你可以使用遊標,或者你可以使用一些更聰明的東西。

你的例子應該能夠沿的線條很容易寫:

update mytable set nextID = LEAD(id,1) over (order by id) 

鉛(ID,1)將會獲取下一個ID,1排前面的記錄集,並更新nextID場用它。如果它找不到一個,它將返回null。不需要循環或條件邏輯!

編輯:我忘了over子句。這是告訴它你會喜歡它訂購了鉛

+0

只是一個註釋導致只適用於SQL 2014及以上。 – Jeremy

+0

啊,好點。 2012年應該也工作:https://msdn.microsoft.com/en-us/library/hh213125(v=sql.110).aspx – LordBaconPants

+0

是的,你是對的。謝謝(你的)信息! – Jeremy