2

列の値が一致する行を選択するサブクエリを考案する必要があります。

Select * 
from person 
where first_name in ('Java','SQL','Oracle');

ただし、括弧内のこのリストは、最大 30,000 の値まで大きくなる可能性があります。ファイルから値を読み取り、この括弧内に渡します。ただし、括弧内に指定できる値の数には制限があるのではないかと考えました。新しいテーブルを作成してデータを読み込むことなく、このシナリオに対処する最適なソリューションはありますか?

編集: ご回答ありがとうございます。以下のクエリは考慮すべきオプションですか -

Select * 
from person 
where first_name like 'Java' 
   or first_name like 'SQL' 
   or first_name like 'Oracle';

ありがとう。

4

2 に答える 2

4

私はジョナサンに同意します.30000の値を連結することはここに行く方法ではなく、彼の解決策は良い方法です. しかし、ここで別のアイデアがあります。Oracle には外部テーブルと呼ばれる便利な機能があります。

外部テーブルを使用すると、ファイルをテーブルのように扱うことができます。ファイルが適切に構造化されている場合 (CSV など)、この機能を簡単に使用できます。

Google の「Oracle External Tables」で検索すると、多くの情報と例が見つかりますが、初心者の方はの記事をお読みください。

基本的に、ファイルの場所を Oracle に伝えるディレクトリ オブジェクトが必要です。次に、次のような外部テーブルを作成します。

create directory DIR_MYFILE as '/my_source_dir/';

create table EXT_MY_FILE
    ( 
      some_id    number(8),
      some_value varchar2(100)
    )
   organization external
   ( default directory DIR_MYFILE 
     access parameters
     ( records delimited by newline
       fields terminated by ','
     )
     location ('my_file.csv')  
 );

クエリでこのテーブルを使用する:

select * from person where first_name in (select some_value from EXT_MY_FILE);

編集: APC のコメントを参照してください。彼は良い点を持っています。

于 2012-06-15T08:19:08.740 に答える
1

PL/SQL でファイルを処理できる場合は、パイプライン化された関数が別のオプションになる可能性があります。

于 2012-06-15T08:27:42.183 に答える