2012-01-07 17 views
1

私がサポートしているアプリケーションの1つに対してクエリを作成していますが、DB2バージョンの結合ステートメントのDB2バージョンを取得しようとするとコストがかかりません。あなたはDB2 INNER JOINまたはステートメント

Select * 
FROM 
    TABLE A INNER JOIN TABLE B 
ON 
    A.USERNAME = B.NAME 
OR 
    A.USERNAME = B.USERNAME 

に内部使用「OR」することはできませんので、私がしようとしてUNIONまたはUNION ALLを見てきたが、私はマッチアップが返すに時間がかかる場合がありますことを心配しています。

+1

あなたの文を使用して、何が悪いのでしょうか?あなたは確かにJOIN条件の中で 'または'を使うことができます。 –

答えて

4

私はORは簡単に結合条件で使用することができることを確認して他の人に参加している間、他のように条件を満たしていれば、クエリは完全にうまくいきます。この特定のケースでは、ORなしでもまだ実行できます。

column = value1 OR column = value2のような条件では、同じ列がさまざまな固定値に対してテストされ、column IN (value1, value2)に変換できます。後者は前者よりも悪くなく、おそらく最後にはっきりと見えるはずです。

だから:

SELECT * 
FROM 
    TABLE A 
INNER JOIN 
    TABLE B 
ON 
    A.USERNAME IN (B.NAME, B.USERNAME) 
+0

これは素晴らしい選択肢です。 –

+0

私はもう一度試しました。そして、あなたは "OR"ステートメントを使うことができます。私が以前に試してみたところ、それは間違いを受けていました。DBAは、私たちが実行しているDB2のバージョンではできないと思っていました。助けてくれてありがとう。答えは例外としてマークされています。 – em3ricasforsale

1

WHERE句の構文を使用して結合することができます。 DB2オプティマイザーは(と私はそれがある疑いがある)巧妙であれば、それは同じように実行するだけでなく、参加する必要があります:

SELECT * FROM TABLE1 A, TABLE2 B 
WHERE A.USERNAME = B.NAME OR A.USERNAME=B.USERNAME 
+0

ここでは、ここで実行している問題は、ここで結合を定義しておらず、オプティマイザが無効な条件に基づいてテーブルをリンクする可能性があるということです。 – em3ricasforsale

+0

そうする必要はありません。 'OR' **は' JOIN'条件で**許されています。 –

0
SELECT GROUP_REDUCTION.TOUR, FROM_DATE, TO_DATE, DISCOUNT, GROUP_SIZE, REDUCTION 
FROM SEASON_DISCOUNT 
RIGHT JOIN GROUP_REDUCTION ON SEASON_DISCOUNT.TOUR = GROUP_REDUCTION.TOUR 
ORDER BY GROUP_REDUCTION.TOUR, FROM_DATE; 
+0

これは質問と何が関係していますか? – Ben