0

Oracleのjoinステートメントの作成でいくつか問題が発生しています。左結合を使用したいと思いますが、100%確実ではありません。

これが私の2つのテーブルです

**VisibilityTable**
Industry
ProductID
Visibility
etc

**ItemTable**
ProductID
Other Info
etc

これが問題です。私は〜15の産業を持っています。各業界は、好みに基づいて製品(〜15000)をパブリックまたはプライベートとしてマークできるようにしたいと考えています。パブリックまたはプライベートに設定されている特定の業界の製品を表示したい場合に、クエリが機能します。

私が直面している問題は、ある業界で製品がパブリックまたはプライベートとしてマークされた後、まだマークされていない業界では表示されなくなったことです。これはこれまでの私の質問です:

SELECT v.*, NVL(b.VISIBILITY,'Not Marked') Visibility 
FROM ItemTable v 
LEFT OUTER JOIN VisibilityTable b ON b.ProductID = v.ProductID
WHERE (
(v.STATUS LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.MODEL LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.DUTY LIKE 'Filter' or 'Filter' LIKE 'All') AND 
(v.CERTIFICATION LIKE 'Filter' or 'Filter' LIKE 'All')
)

これは、「マークなし」、「プライベート」、「パブリック」としてマークされているアイテムを取得するために機能しますが、選択した業界でマークされていないアイテムを取り戻すことはできません。

編集:完全なwhere句を追加しました。これは動的に生成され、構成ファイルからの値に基づいて渡されます。

たとえば、ProductID85322はIndustryEPGBioに対してプライベートとしてマークされていますが、Industry EPGMethaneを選択すると、「未レビュー」として表示されません。プライベートとしてマークされて表示されます。

4

1 に答える 1

2

これは、where句に表示されない結果を除外しているためだと思います。

where句で「b」テーブルを参照する場合、暗黙的にをに変更しleft outer joinますinner join。(あなたがたまたまやっていない限りis null。)

条件をon句に移動します。

やっとわかったと思います。b.VisibilityNULLであることとレコードが存在しないことを区別しようとしています。このためには、次のcaseステートメントが必要です。

select v.*,
       (case when b.ProductId is null then 'Not Marked at All'
             when b.Visibility is null then 'Marked as NULL'
             else b.Visibility'
        end) as Visibility

何が起こっているのかを明確にするために、生成される文字列を変更しました。あなたはそれらを好きなように作ることができます。キーは、結合キーの条件を使用してレコードが存在するかどうかを確認し、値を調べて値が存在するかどうかを確認します。

于 2013-02-26T17:10:15.383 に答える