2013-03-04 13 views
19

ROW_NUMBER()の開始を1の代わりに3258170と定義したいとします。Row_Number()の開始値を手動で指定する

私はしかし、次のSQLクエリ

SELECT ROW_NUMBER() over(order by (select 3258170)) as 'idd'. 

を使用しています、上記のクエリが動作していません。私が働かないと言うと、その実行を意味するが、それは3258170から始まっていない。誰かが私を助けることができますか?

なぜなら、行番号を指定する理由は、あるテーブルから別のテーブルに行を挿入しているからです。最初のテーブルでは、最後のレコードの行番号は3258169です。新しいレコードを挿入すると、行番号は3258170から始まります。

+0

0_0このようなことは可能かどうかはわかりませんが、私は恐ろしい考えであると確信しています。あなたは実際に何を達成しようとしていますか? SQL Serverには整数列が自動的にインクリメントされますが、そうではありませんか? –

+1

正しいIDを保持するために自動インクリメントのプライマリキーを追加できませんか? –

+0

はい、私はそれを行うことができます。他の方法があるかどうかを調べるだけです。 – Huzaifa

答えて

36

だけrow_number()の結果に値を追加します。

select 3258170 - 1 + row_number() over (order by (select NULL)) as idd 

row_number()order by句が順に使用されているものの列を指定します。そこに定数を指定することによって、単に「すべてが注文の目的で同じ価値がある」ということになります。選ばれた最初の値とは何も関係がありません。

混乱を避けるために、定数値をNULLに置き換えました。 SQL Serverでは、であり、実際に行をソートせずにシーケンシャルな数値を割り当てていることがわかりました。パフォーマンスの優位性は実績がありますが、これはドキュメント化されたものではありません。

+0

selectに値を指定するとどうなりますか? – Huzaifa

+0

@John - ROW_NUMBER()が何であるかを理解する必要があり、値を割り当てることができません。あなたはそれに追加することしかできません。 Oracleのドキュメントから:「ROW_NUMBERは分析関数です。これは、適用される各行(パーティション内の各行または問合せによって戻される各行)に、order_by_clauseで指定された順序付けられた行の順序で一意の番号を割り当てます1から始まる。 – Art

+0

MySQLについては、OMG Poniesの回答を参照してください:http://stackoverflow.com/questions/1895110/row-number-in-mysql –

3

私は(JOINのための基本となるデータセット内の重複したレコードがあるかもしれないとき

ROW_NUMBER()は、特に最善の解決策にはならないかもしれ....これは時には簡単に

ROW_NUMBER() OVER(ORDER BY Field) - 1 AS FieldAlias (To start from 0) 
ROW_NUMBER() OVER(ORDER BY Field) + 3258169 AS FieldAlias (To start from 3258170) 
0

であると感じクエリなど)。これにより、予想より多くの行が返されることがあります。 は、シーケンスを作成することを検討してください。これは、場合によってはよりクリーンなソリューションと考えられます。 すなわち:

CREATE SEQUENCE myRowNumberId 
    START WITH 1 
    INCREMENT BY 1 
GO 

SELECT NEXT VALUE FOR myRowNumberId AS 'idd' -- your query 
GO 

DROP SEQUENCE myRowNumberId; -- just to clean-up after ourselves 
GO 

欠点は、配列が完全な配列のマニュアルhereを見る等 DISTINCT、窓関数を用いて複雑なクエリで使用することが困難であるということです。

関連する問題