2010-11-23 6 views
4

どのジョインを行うかを選択するときに条件文を実行できるかどうかを知りたいと思います。SQL条件付きジョイン(内部または外部)

SELECT * FROM Table1 
IF (TRUE) THEN INNER JOIN 
ELSE (FALSE) THEN OUTER JOIN 
END 
Table2 ON (SOME CONDITION) 

これは明らかに動作しませんが、私はそれがより良い私の質問を示していると思う:私が何を意味するかの例は、のようなものかもしれません。

答えて

0

あなたが戻ってくるものはまったく明確ではありません。 IFが行単位で動作するか、クエリ全体に対して一度動作することを期待していますか?

おそらく OUTER JOINで必要なものを取得し、WHERE句で結果をフィルタリングすることができます。

0

いいえこれが必要な場合は、動的にクエリ文字列を作成して実行する必要があります。または、常に外部結合を行い、条件に基づいてフロントエンドで実際に使用する列を選択します。どんな場合でも、より多くの情報がなくても、どんな意味があるのか​​は分かりません。

4

これは、あなたが

外側、内側と外側、内側はもちろん参加含ん参加の両方に同じ列を持っていると思い前提としています。唯一の違いは、WHEREでソートすることができたか非一致する行が処理されています句

SELECT 
    col1, col2 
FROM 
    Table1 
    LEFT OUTER JOIN 
    Table2 ON ... (SOME CONDITION) 
WHERE 
    (conditional = true AND table2.key IS NOT NULL) 
    OR 
    (conditional = false AND table2.key IS NULL) 

OR

+0

ありがとう、あなたの特定の懸念[インナー、アウター]を対処するために変更することができます。あなたのソリューションは私にとっても完璧に機能しました。これは振り返ってみるととてもシンプルで分かりやすいようです;-) –

+0

table2が膨大なもの(何百万というレコード)があり、条件が満たされていないとどうしても結合したくないのですが? – Ben

2

ないとパフォーマンスに関する保証は、しかし、あなたが行うことができますが、両方の作成参加し、その後、あなたには、いくつかの出力列のデータを抽出した1つを選択するための条件を使用して..です。

Select Case When [Some boolean condition] 
     Then A.ColumnName 
     Else B.ColumnName End as OutputColumnName 
    From Table 
    Left Join OneTable As A 
     On [Join conditions] 
    Left Join OtherTable As B 
     On [Join conditions] 

これは、同じように

Select Case When [Some boolean condition] 
     Then A.ColumnName 
     Else B.ColumnName End as OutputColumnName 
    From Table 
    [Inner] Join TheTable As A 
     On [Join conditions] 
    Left [Outer] Join TheTable As B 
     On [Join conditions] 
関連する問題