- - PR -
SELECT INTO でソートした値にIDENTITYをふるには
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-21 01:45
初めて登校させていただく、ういというものです。
よろしくお願いします。 環境 SQLServer2000 TESTDATA列でソートした後に連番を振りたいと思っています。 下のSQLでソートの後に連番がなったのですが、 サブクエリ内にTOPを使用しないとエラーが出るのでTOPをいれてますが固定値なのが気になります。 ソートした後に連番をつけて全件取得する方法はないのでしょうか。 よろしくお願いします。 DROP TABLE ##SUBTABLE; SELECT IDENTITY(int,1,1) AS RANK, * INTO ##SUBTABLE FROM ( SELECT TOP 100 TESTDATA FROM TESTTABLE ORDER BY TESTDATA ) AS SUBTABLE ; SELECT * FROM ##SUBTABLE; | ||||||||
|
投稿日時: 2007-06-21 10:06
なぜインラインビューにしているのかはわかりませんが、ビューのクエリは実際はもっと複雑なんだろうなと思いつつ。 SELECT IDENTITY(int,1,1) AS RANK, * INTO ##SUBTABLE FROM ( SELECT TESTDATA FROM TESTTABLE ) AS SUBTABLE ORDER BY TESTDATA 複雑じゃないのならこんなんでも SELECT IDENTITY(int,1,1) AS RANK, TESTDATA INTO ##SUBTABLE FROM TESTTABLE ORDER BY TESTDATA ビューの中でソートしなきゃ・・・って気持ちは分からなくは無いですが、その必要はないですよね。 | ||||||||
|
投稿日時: 2007-06-21 23:17
>ビューの中でソートしなきゃ・・・って気持ちは分からなくは無いですが、その必要は>ないですよね。
ビューの中でソートするのとSELECT INTOのあとにソートするのではRANK1になる行が変わるようです。 | ||||||||
|
投稿日時: 2007-06-22 10:39
え、まじ? とちとびっくりしたので試さずにはいられませんでした。 SQL Server 2000 SP4 ------------------------------------------- create table #TESTTABLE (TESTDATA INT) insert into #TESTTABLE values(10) insert into #TESTTABLE values(1) insert into #TESTTABLE values(5) insert into #TESTTABLE values(3) --うい さんの SELECT IDENTITY(int,1,1) AS RANK, * INTO #SUBTABLE1 FROM ( SELECT TOP 3 TESTDATA --結果が異なることを示すため100を3に FROM #TESTTABLE ORDER BY TESTDATA ) AS SUBTABLE --おれの SELECT IDENTITY(int,1,1) AS RANK, TESTDATA INTO #SUBTABLE2 FROM #TESTTABLE ORDER BY TESTDATA select * from #SUBTABLE1 select * from #SUBTABLE2 ---------------------------------------------- 結果 RANK TESTDATA 1 1 2 3 3 5 (3 件処理されました) RANK TESTDATA 1 1 2 3 3 5 4 10 (4 件処理されました) うぅ〜ん、「RANK1になる行」は同じです。 その現象が起きるミニマムのデータとクエリを提示することは可能でしょうか。 | ||||||||
|
投稿日時: 2007-06-24 22:43
返信遅れてすいません。
環境はSQLServer2000 体験版です。 drop table ##subtable1; SELECT IDENTITY(int,1,1) AS RANK, * INTO ##SUBTABLE1 FROM ( SELECT TOP 3 TESTDATA FROM TESTTABLE ) AS SUBTABLE ORDER BY TESTDATA ; select * from ##subtable1; 結果(ORDER BYが外) RANK TESTDATA 3 10 2 11 1 12 drop table ##subtable1; SELECT IDENTITY(int,1,1) AS RANK, * INTO ##SUBTABLE1 FROM ( SELECT TOP 3 TESTDATA FROM TESTTABLE ORDER BY TESTDATA ) AS SUBTABLE; select * from ##subtable1; 結果(ORDER BYが内) 1 10 2 11 3 12 ORDER BYを外に持ってくるとTESTDATA10に対してRANKが3になってます。 中に入れると10のRANKが1になります。 | ||||||||
|
投稿日時: 2007-06-24 22:47
テストデータを入れると大きい数字から入れていくとこういった現象がおきました。
テストツールにはクエリアナライザを使っています。 | ||||||||
|
投稿日時: 2007-06-25 11:45
はい。その辺も確認できるようにと思って、以前のテストにおいてテストデータは以下のようにランダムに入力していました。
こちらの環境は、SQL Server 2000 Developer Edition (SP4) です。 念のため、今回のういさんのバッチを少々カスタマイズしてもう一回テストしてみました。 ------------------------------------------------ create table ##TESTTABLE (TESTDATA INT) insert into ##TESTTABLE values(12) --大きい順で insert into ##TESTTABLE values(11) insert into ##TESTTABLE values(10) SELECT IDENTITY(int,1,1) AS RANK, * INTO ##SUBTABLE1 FROM ( SELECT TOP 3 TESTDATA FROM ##TESTTABLE ) AS SUBTABLE ORDER BY TESTDATA ; select * from ##SUBTABLE1; ------------------------------------------------ 結果 RANK TESTDATA 1 10 2 11 3 12 (3 件処理されました) うちの環境では問題ないんですよねぇ。実行プランを見ると、Sort後にComputeScalarになってますし。たまたまなのだろうか・・・。 一応、実行プランを確認してみてはどうでしょうか。 | ||||||||
|
投稿日時: 2007-07-06 00:35
返信遅れてすいません。
かめたろさんに載せていただいたSQLをそのまま実行した結果を 下に貼り付けます。 RAMK TESTDATA 3 10 2 11 1 12 SELECT INTO部分の実行計画を載せます。 TableScan57%→Top0%→ComputeScalar0%→Sort17%→ComputeScalar0%→Top0% →TableInsert/Insert25%→SELECT INTO0% 実行計画の意味自体を勉強中なのでよくわかりませんでした。 |