5

SQL Server 2005のテーブルの複数の行(29)を更新する必要があります。

SELECT * from tblState ORDER BY StateCode ASC. 

この表には、1から29までの番号を割り当てる必要がある整数列があります。たとえば、

BEFORE

A 3 

B 6

C 2 
D 1 

AFTER

A 1  
B 2  
C 3  
D 4

昇順の連続番号で各行を効率的に更新するにはどうすればよいですか?

4

6 に答える 6

5
WITH
  sequenced_data AS
(
  SELECT
    ROW_NUMBER() OVER (ORDER BY StateCode ASC) AS sequence_id,
    *
  FROM
    tblState
)
UPDATE
  sequenced_data
SET
  integer_column = sequence_id

ループを求めているので、このコードを理解していない可能性があります。

そのため、ダミーのテーブルを作成してこれを試してみることを強くお勧めします。これは、それがどのように機能するかを理解し、希望/期待どおりに動作することを確認するためです。

  • ステートメントはWITHサブクエリに似ています
  • その中で、ROW_NUMBER()あなたが望むシーケンシャルIDを作成します
  • 次に、外側のクエリが列を更新します(サブクエリを参照しますが、実際のテーブルは実際に更新されます)
于 2012-10-10T09:42:43.743 に答える
2

可能な限り、SQL でのループを避ける必要があります。SQL Server は、セットベースの操作に向けて大幅に最適化されています。

この場合、CTEwithROW_NUMBER関数を使用できます。

WITH CTE AS
(
   SELECT StateCode, IntColumn
   ,  RN = ROW_NUMBER() OVER (ORDER BY StateCode ASC)
   FROM dbo.tblState
)
UPDATE CTE SET IntColumn = RN;

蹴る悪い習慣 : WHILE ループは CURSOR ではないと考える

于 2012-10-10T09:42:48.180 に答える
0

cteなしの私のオプション:

UPDATE d
SET d.integer_column = d.sequence_id
FROM (
      SELECT integer_column, ROW_NUMBER() OVER (ORDER BY StateCode ASC) AS sequence_id 
      FROM dbo.tblState
      ) d 
于 2012-10-10T10:20:35.737 に答える
0

これを試して:

with CTE1 as(select StateCode,intcol,ROW_NUMBER() over (order by StateCode) as rn from tbln)
update CTE1 set intcol=rn
select * from tbln
于 2012-10-10T09:47:37.393 に答える
0

共通テーブル式を使用できます

with c as
(
    select ID, ROW_NUMBER() 
    over (order by StateCode ASC) as cn 
    from tblState 
)
update c set ID = cn
于 2012-10-10T09:49:27.977 に答える
0

新しい行を挿入するたびに番号を変更する必要があるため、番号をテーブルに保存しないでください。

やるだけ

SELECT
                ROW_NUMBER() OVER (ORDER BY StateCode ASC) sequence_id
              , *   
    FROM 
              tblState

データを取得するたびに。

多くの行があり、これを高速に行う必要がある場合は、StateCode ASC

于 2012-10-10T09:55:45.280 に答える