2016-12-27 16 views
1

テーブルの構造とデザインが正しく作成されていない古いシステムを維持しています。私はこれが "醜い"状況であることを知っていますが、私はそれに対処する必要があります。別のフィールドに基づくINNER JOIN AS400

私は複数のフィールドを含むテーブルTABLEAを持っています。 2つはMODEL(MODEL1とMODEL2)を表します。状態(STATUS)に基づいて、MODEL1とMODEL2は、以下の値を有する:

  1. ステータス= "A" THEN MODEL1 = "モデル" AND MODEL2 = ""
  2. STATUS <> "A" THEN MODEL1 = "" AND MODEL2 = "モデル"

私はモデル上の別のテーブルTABLEBとTABLEAを結合するクエリを実行する必要があります。状態によると、私は非空のモデルフィールドとテーブルを結合する必要があります。

SELECT * 
FROM TABLEA A INNER JOIN TABLEB B 
ON (A.MODEL1 || A.MODEL2) = B.MODEL; 

をしかし、IF条件を使用してそれを行うためのエレガントな方法がある場合、私は疑問に思って:

私はMODEL1とMODEL2を連結して、それを解決することができます。 他の解決策を歓迎します。

UPDATE - サンプル・データ enter image description here

+0

サンプルテーブルのデータを表示してください。 –

+0

@TimBiegeleisen、私の更新を参照してください – ehh

答えて

1

あなたはすべてこのように労働組合を使用することができますが:

select * 
    from tablea a 
    inner join tableb b 
     on a.model1 = b.model and a.status = 'A' 
union all 
select * 
    from tablea a 
    inner join tableb b 
     on a.model2 = b.model and a.status <> 'A' 
+0

私はこのソリューションが大好きですが、空であるかどうかによって暗示されているため、ステータスを確認する必要はほとんどありません。一致する空の値がない場合は、明らかに不要です。可能であれば、ステータス= Aを確認するとより良い結果が得られるが、空を空に変換する – Juan

+0

申し訳ありませんが、空の空になることはステータス<> 'A'より良くなる可能性があります – Juan

+0

時間の経過とともに、いずれかのモデルフィールドで孤立したモデル。ステータスを確認することで、孤児が問題を引き起こすのを防ぐことができます。または、ユーザーは、状況が変化したときに適切なモデルフィールドを空にすることによって、プログラムによってデータの整合性を保証することができます。 – jmarkmurphy

0

私はより良いjmarkmurphyのソリューションを好むが、ここでは左が参加し使用することにより、別のオプションです。

SELECT CASE WHEN b1.col1 = '' THEN b2.col1 ELSE b1.col1 END ...... 
FROM tablea a 
LEFT JOIN tableb b1 
ON a.model1 = b1.model 
LEFT JOIN tableb b2 
ON a.model2 = b2.model 

しかし、すべての可能性であれば、スキーマ内のチャンは、最良の選択肢である:

  • はMODEL1とMODEL2の両方のすべての空でない値を持つ新しいa.model列を追加し、それに参加します。以下のようなマテリアライズド・ビューの使用

  • はSELECT *、CASE WHEN TABLEA

  • からモデル

    AS a.model1 = '' THEN ELSE a.model2 a.model1 END。

    a.model1またはa.model2にクエリのパフォーマンスを向上させるインデックスがない場合は、前のビューをマテリアライズされていない可能性のあるインラインビューとして使用できます。