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_NUMBEROVER()スタイルで実行できると確信していますが、正確な構文はわかりません。

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より古いMSSQLはROW_NUMBER()をサポートしていません。

于 2009-10-13T16:03:48.023 に答える