• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SELECTした結果に行番号を求めたい)

SELECTした結果に行番号を求める方法とは?

このQ&Aのポイント
  • Oracleのrow_numberのような関数はないのでしょうか?
  • Order By句を指定してSELECTした結果の行番号を求めたいのですが、なにか良い方法はないのでしょうか。
  • 例えば、Code1、Code2、Code3でORDER BYした結果の行番号を求める方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

次のSQLを試してみてください。 select (select count(*)+1 from t1 as x where x.c1<y.c1 or x.c1=y.c1 and x.c2<y.c2 or x.c1=y.c1 and x.c2=y.c2 and x.c3<y.c3) as no, c1,c2,c3 from t1 as y order by no;

rabu_chihaha
質問者

お礼

ありがとうございました。 出来ました。 count(*)+1だと、NOが2から始まってしまったので、 count(*)にしてみたら、出来ました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

> Oracleのrow_numberのような関数はないのでしょうか? 私の知る限りでは、ないです。 > Order By句を指定してSELECTした結果の行番号を求めたいのです Code1、Code2、Code3の3列で、ユニークになりますか? あるいは、これ以外に、行をユニークに識別できるキーがありますか?

rabu_chihaha
質問者

補足

やはりないのですか・・・。 Code1、Code2、Code3の3列で、ユニークになります。 何か方法がありますか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • WITH句を使用したSQLの結果

    WITH句を使用して総件数と1~20件までのデータを同時に取得するSQLを組んでみたところ、 WITH TMP AS (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM TMP) T1, TMP T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20; Oracle10.2.0.3.0のバージョンで ALLCNTが21になってしまう現象が発生してしまいました。 Oracle10.2.0.4.0や9iでは発生せず正しい総件数が取得できるのですが、 バージョンによる不具合は考えられますでしょうか。 それともSQL自体なにか悪い部分があるのでしょうか。 ちなみに T2.CHECKROWNUM BETWEEN 1 AND 100; と帰るとALLCNTが101と帰ってきます。 また、WITH句を使わず下記のようにTMPの部分をWITH句で使用したSQLに 置き換えると正しくALLCNTが取れます。 SELECT T1.ALLCNT, T2.* FROM (SELECT COUNT(*) ALLCNT FROM (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO)) T1, (SELECT ROW_NUMBER() OVER (ORDER BY NO) AS CHECKROWNUM,NAME FROM TEST_TBL ORDER BY NO) T2 WHERE T2.CHECKROWNUM BETWEEN 1 AND 20;

  • MySQLで行番号を得たい

    MySQLでOracleのROW_NUMBER関数に相当する結果を得る方法はありますか? 具体的にはあるテーブルからソートしつつ得た結果を、空のテーブルにソート順位付きでinsertしたいのです。 宜しくお願い致します。

  • ROW_NUMBER()を使用したデータ取得

    ROW_NUMBER()を使用してORDERした結果の5行目から10行目を 取得したい場合、どこのサイトを参照しても下記(1)のように NOで並び替えたデータをインラインビューとして WHERE RNUM BETWEEN 5 AND 10 と条件を絞っていますが、(2)のように直接条件を指定した場合と どのような違いがあるのか教えてください。 (1) SELECT NO, NAME FROM ( SELECT NO, NAME, ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST ) WHERE RNUM BETWEEN 5 AND 10 (2) SELECT NO, NAME,ROW_NUMBER() OVER (ORDER BY NO) RNUM FROM ROWNUM_TEST WHERE RNUM BETWEEN 5 AND 10

  • oracleでwith句の結果を使ってupdate

    oracleでwith句の結果を使って外部結合?でupdateしたいのですが 上手くいきません。 oracleでは無理なのでしょうか。 よろしくお願いいたします、。 /*---------- with v1 as ( select row_number() over(PARTITION BY ・・・ ORDER BY ・・・) as rnum ,no ,col1 ,・・・ from ・・・ ) update ( select A.col1 A_COL, v1.col2 B_COL from table1 A inner join table2 B on A.cd1=B.cd1 inner join v1 on A.no=v1.no where v1.rnum=1 and ・・・ ) set A_COL=B_COL ; ----------*/ と書いたのですが、 実際に実行してみると、 カッコ「(」、「)」がないとか、 selectが必要とか, A_COLやB_COLが無効ですとか、 となります。 どこが悪いのでしょうか。 oracleではupdateでwithは使えないのでしょうか。 よろしくお願いします。

  • SELECT文での行のばらし方

    こんにちは。 Oracle(9i)でのSELECT文記述で思いつかないので、投稿させていただきました。 宜しくお願い致します。 下表のように、 テーブル情報 ---------------------- 伝票NO  商品NO  数量 ---------------------- 伝01    商品A    2 伝02    商品B    3 ---------------------- というテーブルがあった場合に、 SELECT文にて抽出した結果が、数量を1個に固定して、 下表のように、元の数量分に行をばらす(複数行化する)こと をしたいのですが。 SELECT文の結果 ---------------------- 伝票NO  商品NO  数量 ---------------------- 伝01    商品A    1 伝01    商品A    1 伝02    商品B    1 伝02    商品B    1 伝02    商品B    1 ---------------------- SELECT文として記述できる方法がありましたら、 ご教示下さいますよう宜しくお願い致します。

  • SELECT方法を教えていただきたく・・。

    「売上見出し」と「売上明細」の2つのテーブルがあります。 「売上見出し」には売上No.・顧客コード・合計金額が、「売上明細」には売上No.・行No.・売上内容・金額がそれぞれフィールドであり、売上No.により1:多の形でひも付けされます。 「売上明細」の「売上内容」フィールドのキーワード検索するようなしくみを作ろうとしているのですが、検索句で一致した売上No.の「売上見出し」テーブルのレコードをそのままSELECTしたいのです。どのようなSELECT句が有効でしょうか? よろしくお願いします。 (「売上明細」テーブルはSELECTの必要はありません。)

    • ベストアンサー
    • MySQL
  • Select結果をSelect

    お世話になります。 以下のSQL文のイメージでselectの結果をさらにselectしたいのですが”subquery has too many columns”というエラーを吐かれます。 Postgreに合った書き方がお分かりでしたら教えてください。 よろしくお願いします。 select * from [DB名] where [パスワード] = 'test' IN ( select * from [DB名] where [ユーザID]='1111' order by [更新日] desc limit 3) [やりたいこと] テストDBからユーザIDが1111の行を更新日をキーに降順で並べ、先頭から3行分を取り出す。 その3行からパスワードが"test"のものをselectしたい。

  • SELECT分での結果の取り出し方

    以下の様なテーブルから SELECT分で条件をWHERE CODE = '0001' の様に指定して 求まった結果を1つの文字列にしたいのですが 良い方法がありましたら、教えて下さい。 SELECT * from testtbl; CODE NAME ------------------------------- 0001 AAAA 0001 BBBB 0002 CCCC 0003 DDDD この例だと、 SELECT NAME FROM testtbl WHERE CODE = '0001'の様な形で NAMEの部分の結果として,'AAAA,BBBB'の文字列を取得したいです。 ファンクションとかで実現できるでしょうか?

  • ソートと列番号

    データ取得時に列番号を組み込みたい場合 ROW_NUMBER() OVER (ORDER BY ソートキー) で実現できますが、これは実際ソートも行ってくれるのでしょうか? 例えば 1) select dt1,dt2, dt3,ROW_NUMBER() OVER (ORDER BY dt1,dt2,dt3) as dt4 from table_1 2) select dt1,dt2, dt3 from table_1 ORDER BY dt1,dt2,dt3 では同じ順序でデータが取得されるのでしょうか? 簡単にデータを作ってみたところ、同じようなんですが・・・・

  • ビュー(インラインビュー)で集約した結果と結合するSQLについて

    テーブルAを複数のキー項目で集約した結果と、テーブルBを結合しようとしています。 インラインビュー(もしくはビュー)で予め集約を行う、以下のようなSQLを考えました。 候補<1> MAX関数でTableA.列1を絞る select ... from (select max(列1),列2,列3,列4 from TableA group by 列2,列3,列4) TableA2,Table_B where TableA.列2=TableB.列2 and ...; 候補<2> ROW_NUMBER関数で列1の順位を取得し、Where句で順位=1とすることでTableA.列1を絞る select ... from (select 列2,列3,列4 from TableA group by 列2,列3,列4 row_number() over (partition by 列2,列3,列4 order by 列1) RN) TableA2,Table_B where TableA.列2=TableB.列2 and ... and RN=1; ※候補<1><2>で結果が異なることがありますが、ともかく 「インラインビュー(もしくはビュー)で予め集約を行う」がやりたいことです。 しかしこのようなクエリだと、インラインビューでもビューでも、 性能がでません。実行計画を確認したところ、TableA,TableBの結合で生成される レコードごとに毎回集約を行っているようで、膨大なクエリ数が発生していました。 ビューやインラインビューで上記のように集約を行うと危険、とはよく聞きますが... ビューやインラインビューで集約した結果をひとつのテーブルとみなして結合するなど、 レコードごとに集約を行わないようなノウハウがありましたら、お教え願います。