2

列 ID (1590 値) を持つテーブル serviceClusters があります。次に、列 ID、テキスト、およびコメントを含む別のテーブル serviceClustersNew があります。このテーブルには、テキストとコメントの値がいくつかあります。ID は常に 1 です。テーブルの例を次に示します。

[1、ダミー1、ハロー1;

1、ダミー2、ハロー2;

1、ダミー3、ハロー3;

等。]

列 ID の値に必要なのは、テーブル serviceClusters の継続的なインデックスと現在の行番号です。この場合、これは 1591、1592、および 1593 になります。

私はこのような問題を解決しようとしました:最初に列IDを最大値で更新し、次に行番号を追加しようとしましたが、これはうまくいきません:

-- Update ID to the maximum value 1590
UPDATE serviceClustersNew 
SET ID = (SELECT MAX(ID) FROM serviceClusters);
-- This command returns the correct values 1591, 1592 and 1593
SELECT ID+ROW_NUMBER() OVER (ORDER BY Text_ID) AS RowNumber 
FROM serviceClustersNew
-- But I'm not able to update the table with this command
UPDATE serviceClustersNew 
SET ID = (SELECT ID+ROW_NUMBER() OVER (ORDER BY Text_ID) AS RowNumber FROM
serviceClustersNew)

最後のコマンドを送信すると、「構文エラー: 順序付き分析関数はサブクエリでは許可されていません。」というエラーが表示されます。どうすれば問題を解決できるか、何か提案はありますか? 揮発性テーブルを使用するか、列を追加することでそれを実行できることはわかっていますが、新しいテーブルを作成したり、現在のテーブルを変更したりしない方法はありますか?

4

3 に答える 3

1

多くのデータを扱っているわけではないので、相関サブクエリは同じ目的を果たすことができます:

UPDATE serviceClustersNew 
    SET ID = (select max(ID) from serviceClustersNew) +
             (select count(*)
              from serviceClustersNew scn2
              where scn2.Text_Id <= serviceClustersNew.TextId
             )

text_idこれは、が行に沿って一意であることを前提としています。

于 2013-07-31T12:56:53.777 に答える
0

どうやらCTEを介してベーステーブルを更新できるようです...わかりませんでした。したがって、最後の UPDATE ステートメントをこれに変更するだけで問題ありません。更新したいフィールドを CTE に必ず含めてください。

;WITH cte_TEST AS 
( SELECT 
    ID,
    ID+ROW_NUMBER() OVER (ORDER BY TEXT_ID) AS RowNumber FROM serviceClustersNew)
UPDATE cte_TEST 
SET cte_TEST.ID = cte_TEST.RowNumber

ソース: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/ee06f451-c418-4bca-8288-010410e8cf14/update-table-using-rownumber-over

于 2013-07-31T13:04:05.443 に答える