1

次の IN クエリを内部結合クエリに変換したい:

select country, name, rank from table person_details 
   where country in ('india','USA','australia') 
   and   name in ('tom', 'jill', 'jack') 
   and   rank in ('first', 'third', 'fifith');

2 つの質問があります。

  1. このテーブルは大きいので、この IN クエリを内部結合に変更すると速度が向上します。

  2. このカンマ区切りのリストを一時テーブルの列に分割する最良の方法は何ですか。多くの正規表現の例を見てきましたが、それらは複雑すぎて大きすぎるようです。

Oracle 11g DB を使用しています。

テーブルのスナップショット:

Id   name   country   rank
 1    tom    india     first
 2    jill   USA      second
 3    jack   aus       first
4

1 に答える 1

0

表 person_details から国、名前、ランクを選択

クエリが構文的に正しくありません。キーワード TABLE は必要ありません。ただ行う:

select country, name, rank from person_details

厳密に言えば、テーブルは正規化されていません。1 つの列に複数の値を格納しないでください。遅かれ早かれ、パフォーマンスの問題が発生します。テーブルを再設計し、値を別々の列に保存するのに遅すぎることはありません。

そうは言っても、カンマ区切りの文字列を行に分割する方法はたくさんあります。CONNECT BY句でREGEXP_SUBSTRINSTRを使用する簡単な方法の 1 つを次に示します。

SQL> WITH DATA AS(
  2  select q'['india','USA','australia']' countries,
  3  q'['tom', 'jill', 'jack']' names,
  4  q'['first', 'third', 'fifth']' ranks
  5  from dual
  6  )
  7  SELECT regexp_substr(translate(countries,'''',' '), '[^,]+', 1, LEVEL) countries,
  8  trim(regexp_substr(translate(names,'''',' '), '[^,]+', 1, LEVEL)) names,
  9  trim(regexp_substr(translate(ranks,'''',' '), '[^,]+', 1, LEVEL)) ranks
 10  FROM DATA
 11  CONNECT BY instr(countries, ',', 1, LEVEL - 1) > 0
 12  /

COUNTRIES                 NAMES                 RANKS
------------------------- --------------------- -------------------------
 india                    tom                   first
 USA                      jill                  third
 australia                jack                  fifth

SQL>

私の記事ORACLE DELIMITED STRING MANIPULATIONで他の方法を示しました。

于 2015-03-10T05:36:05.083 に答える