2016-04-04 2 views
0

ご迷惑をおかけしますが、ご了承ください。私はOracleで働いています。Oracleでの変数除外の表は?

私はカントリー、ディビジョン、サブディビジョン、SpendCategoryなどの列で構成された大きなテーブルを持っています。私はこの大きなテーブルのために各国ごとに潜在的に柔軟な除外基準を作成する必要があり、そうですね。

CREATE TABLE EXCLUSIONS 

(COUNTRY VARCHAR(50), EXCLUSIONFIELD VARCHAR(50), FIELDVALUE VARCHAR(50)); 

私の考えは、私は

Mexico - Division - "Central Division" 

Mexico - SubDivision - "Mexico City" 

France - Division - "Paris Division" 

...

そして、このテーブルと同様の行で、このテーブルを読み込むことができ、自動的にデータ (除外するために私のテーブルをフィルタリングするということでした国名=メキシコおよび部門= "中央部門")、 (国=メキシコおよび下位区分= "メキシコシティ")、(国=フランスAND 部門= "パリ​​部門")、

...

だから、私は二つの質問を持っていると思います。まず、これを行うにはこれが最善の方法ですか?除外リストは潜在的に長く、サードパーティがテーブルを管理することは、手動で多数の条件を更新するよりも実行可能なように思えるので、このアイデアは気に入っています。次に、メインテーブルから除外テーブルのすべての条件を除外するクエリをどのように記述しますか?あなたはまたして選択フィルタリングするには
(国、細分化)していない(....)で条件を使用することができます

+1

除外テーブルとselect * fromテーブルの同じ構造を保持する方法(除外から除外する国、部門、細分、部門を選択する)に(country、division、subdivision、spendcategory)はありませんか? –

答えて

0

あなたは(...どこcondition_tableから1を選択)が存在しません使用することができ、データを除外するために
いくつかのデータを、あなたが選択する前に句「で」を使用して動的にテーブルを定義することができます...何をやっている

3

が働くことができますが、クエリは次のようなものになります。

select t.* 
from t 
where not exists (select 1 
        from exclusions e 
        where e.exclusionfield = 'country' and e.value = t.country or 
         e.exclusionfield = 'district' and e.value = t.district or 
         . . . 
       ); 

をこれは非常にすることができハードクエリを最適化します。あなたは、この別のサブクエリを使用して表現したいことがありますe.exclusionfield =「地区」とe.value = t.district )除外電子 から

select t.* 
from t 
where not exists (select 1 
        from exclusions e 
        where e.exclusionfield = 'country' and e.value = t.country 
       ) or 
     not exists (select 1 

を。

インデックスをexclusions(value, exclusionfield)に設定すると、適切なパフォーマンスを得ることができます。

代わりに、列を複製することもできます。 。 。 exclusionfield列を削除countrydistrictなどは、:

select t.* 
from t 
where exists (select 1 
       from exclusions e 
       from e.country = t.country or 
        e.district = t.district or 
        . . . 
      ); 

これはまた別のexistsサブクエリとのより良い最適化するかもしれません。