こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

レコードの選択の仕方

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 略

投稿日時 - 2006-12-01 18:33:50

QNo.2574248

すぐに回答ほしいです

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

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

あと自分ならば、
このようなマニアックな質問するのに
穴場的存在と思えるこの場を選ばないだろうな~と思います。

投稿日時 - 2006-12-01 19:55:52

補足

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

投稿日時 - 2006-12-04 17:56:41

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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;
/

投稿日時 - 2006-12-04 10:17:10

あなたにオススメの質問