• ベストアンサー

レコードの選択の仕方

sqlのチューニングが得意なOracle Master所有者です。 ちょっとわからないことがあるので教えてください。 KEY1, KEY2でソートし、 ・先頭レコード ・最終レコード ・項目A1~A100の値が変わったレコード を出力したいのですが、どうすればよいでしょうか? レコード数は約7万で、「SQLで」驚速で処理したいです。 中間テーブルを使用して、特別なインデクスや編集を使用する例でも構いません。 例)★が出力するレコード KEY1 KEY2 A1 A2 A3 ... A100 A 1 0 1 0 0 ★ A 2 0 1 0 0 A 3 0 2 0 0 ★ A 4 0 2 0 0 A 5 0 1 0 0 ★ A 6 0 2 0 0 ★ ... A 60 0 2 5 0 ★ B 1 0 1 0 0 ★ B 2 0 1 0 0 B 3 0 0 0 0 ★ B 4 0 0 1 0 ★ B 5 0 0 1 0 ... B 70 0 2 5 0 ★ C 略

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

  • ベストアンサー
  • MZ-80B
  • ベストアンサー率56% (46/81)
回答No.1

激速を要求してトリッキーな手法も含むのであれば 厳密なバージョン、エディション、更新頻度、テーブル定義を 載せるのが良いです。 従属項目の属性、値域、カーディナリティはかなり重要ですから そちらも提示した方がなお良しです。 チューニングが得意と前置きして激速と回答者に高い敷居を設けるのであれば まずは、自分の書いたボーダーとなるSQLを明示することが必要でしょう。 あと自分ならば、 このようなマニアックな質問するのに 穴場的存在と思えるこの場を選ばないだろうな~と思います。

ktktkota
質問者

補足

ふむむ。 結局、ナンバーを row_number()で付与し、ナンバーが1番違うのを比較することにしました。

その他の回答 (1)

  • kazu1213
  • ベストアンサー率60% (3/5)
回答No.2

PL/SQLによるテキストファイル出力例(/tmp/test.txt)です。 ※ 項目間は半角スペース declare  ftype utl_file.file_type;  chead varchar2(1000) := 'key1 key2';  data_old varchar2(1000) := ' '; ncount integer;  n integer := 1;  cursor c1 is   select key1,key2,       A1 || ' ' || A2 || ' ' || ‥‥ || ' ' || A100 data   from tbl   order by key1,key2; begin  ftype := utl_file.fopen('/tmp','test.txt','w');  for i in 1..100 loop   chead := chead || ' A' || to_char(i,'FM999');  end loop;  utl_file.putf(ftype,chead || '\n');  select count(*) into ncount from tbl;  for c1_rec in c1 loop   if c1_rec.data != data_old or n = ncount then      /* 先頭レコード or 変更レコード or 最終レコード? */    utl_file.putf(ftype,c1_rec.key1 || ' ' || c1_rec.key2                    || c1_rec.data || '\n');   end if;   data_old := c1_rec.data;   n := n + 1;  end loop;  utl_file.fclose(ftype); end; /

関連するQ&A