2009-02-04 24 views
8

我最近將大約60k條記錄導入到一個表中,該表將一個表中的數據與另一個表中的數據相關聯。但是,我的客戶後來要求將一個排序順序添加到所有60k記錄中。我希望有一個很好的乾淨的方式來自動生成SQL更新中的這些排序順序。完成的數據應該是這樣的:使用SQL UPDATE自動生成排序順序

item1ID item2ID sortOrder 
1   123  1 
1   12  2 
1   45  3 
1   22  4 
1   456  5 
2   5   1 
2   234  2 
2   56  3 

可以這樣做嗎?任何建議將非常感激。

--Anne

回答

10

您可以通過Item1ID使用[ROW_NUMBER] [1]和分區

UPDATE t1 
SET t1.SortOrder = t2.SortOrder 
FROM @t t1 
INNER JOIN 
(SELECT Item1ID, Item2ID, ROW_NUMBER() OVER 
    (PARTITION BY Item1ID ORDER BY Item1ID, Item2ID) AS SortOrder 
from @t) t2 
ON t1.Item1ID = t2.Item1ID 
AND t1.Item2ID = t2.Item2ID 
+0

這是更改SortOrder以按第一列第二列排序的好方法。目前尚不清楚這是海報的要求,因爲示例數據並未按前兩欄進行排序。不過,這是一個很好的答案。 – eksortso 2009-02-04 16:35:21

+0

請看看下面的問題: http://stackoverflow.com/questions/1934738/custom-sort-order-with-sql-server-and-net-entity-framework – Shimmy 2009-12-20 05:12:54

0

從理論上說,你可以說:

update mytable 
    set sortOrder = row_number() 
    over (partition by item1id order by item1id, item2id) from mytable 

然而,這會給您錯誤信息:

Msg 4108, Level 15, State 1, Line 1 
Windowed functions can only appear in the SELECT or ORDER BY clauses. 

因此,您實際上必須分兩步執行 - 首先將值選擇到臨時表中,然後從臨時表中更新原始值。

例如:

select 
    item1ID, 
    item2ID, 
    row_number() 
     over (partition by item1id order by item1id, item2id) as sortOrder 
    into #tmp 
    from mytable 

update mytable 
    set sortOrder = T.sortOrder 
    FROM 
    mytable M 
    inner join #tmp T 
     on M.item1ID = T.item1ID 
     AND M.item2ID = T.item2ID 

drop table #tmp 
1

你觸摸的東西對這裏的關係模型的基礎。在整個數據庫中,沒有內在排序的事情。如果您希望在查看錶格時從數據中獲取訂單,則必須明確指定該順序。

所以在一般意義上,你要求的是不可能的。你不能僅僅使用UPDATE表格,並且可以自動排序查詢你所做的任何查詢。但在查詢查詢意義上,您始終可以將「ORDER BY item1ID, sortOrder」放在您應用於該表的任何SELECT聲明中。

在SQL Server 2005中,你可以寫一個視圖,它呈現給你的客戶,使用這個老黑客:

SELECT TOP 100 PERCENT 
    item1ID, item2ID, sortOrder -- and all the other columns 
FROM YourTable 
ORDER BY item1ID, sortOrder; 

有做這樣的觀點更新的方式,但你需要研究那是你自己的。這並不難。

如果您永遠不會在此表中插入或更改數據,並且如果您願意再次將數據重新導入到表中,則可以使用標識定義表,然後將數據插入表中以適當的順序。那麼你總是會以一個標識列來排序。如果您的客戶始終在允許按單列進行排序的程序中查看數據,那麼這將起作用。 (順便說一句,從來沒有使用IDENTITY功能作此用途。這是行不通的。)

CREATE TABLE YourTable (
    SingleSortColumn INT IDENTITY(1,1) NOT NULL, 
    ... 
); 
INSERT INTO YourTable (
    item1ID, item2ID, sortOrder -- everything except the SingleSortColumn 
) 
SELECT -- all your columns 
INTO YourTable 
FROM yadda yadda yadda 
ORDER BY item1ID, sortOrder; 

希望這是有幫助的。對不起,如果我是迂腐。