3

我有一个这样的值表:

CREATE TABLE 
(
    Name1 VARCHAR (50),
    Name2 VARCHAR (50),
    Sequence INT
)

在这张表中,我有这样的行

'Bob', 'Jones', 1
'James','Ant', 2

我想要根据 Name2 列的顺序更新(UPDATE SET)序列的最佳方法,所以重新排序时的值是:

'James','Ant', 1
'Bob', 'Jones', 2

我很确定这可以通过 CTE 的 ROW_NUMBER OVER() 样式完成,但不确定确切的语法。

4

4 回答 4

6

您可以更新 CTE:

WITH OrderedT AS
(
  SELECT Sequence, 
  ROW_NUMBER() OVER (ORDER BY Name2, Name1) as rn
  FROM T
)
UPDATE OrderedT
SET Sequence = rn;
于 2009-10-13T15:41:08.173 回答
4

像这样的东西怎么样:

WITH OrderedByName AS
(
  SELECT Name1, Name2, 
  ROW_NUMBER() OVER(ORDER BY Name2, Name1) as 'RowNum'
  FROM YourTable
)
UPDATE YourTable
SET Sequence = obn.RowNum
FROM OrderedByName obn
WHERE obn.Name1 = YourTable.Name1 
  AND obn.Name2 = YourTable.Name2

马克

于 2009-10-13T15:27:18.200 回答
1

你不需要使用 CTE,派生表可以工作,试试这个:

create table abc 
(
    Name1 VARCHAR (50),
    Name2 VARCHAR (50),
    Sequence INT
)

insert into abc values ('Bob', 'Jones', 1
)
insert into abc values ('James','Ant', 2
)

SELECT * FROM abc ORDER BY Sequence

UPDATE a
    SET Sequence=dt.Rank
    FROM abc a
        INNER JOIN (SELECT
                        Name1, Name2 
                            ,ROW_NUMBER() OVER(ORDER BY Name2, Name1,Sequence) AS Rank
                     FROM abc
                   ) dt ON a.Name1=dt.Name1 AND a.Name2=dt.Name2

SELECT * FROM abc ORDER BY Sequence

输出:

Name1               Name2    Sequence
------------------- -------- -----------
Bob                 Jones    1
James               Ant      2

(2 row(s) affected)

(2 row(s) affected)

Name1               Name2    Sequence
------------------- -------- -----------
James               Ant      1
Bob                 Jones    2

(2 row(s) affected)
于 2009-10-13T15:40:56.520 回答
0

响应 KM 的解决方案 - 早于 2005 年的 MS SQL 不支持 ROW_NUMBER()。

于 2009-10-13T16:03:48.023 回答