2011-09-01 32 views
21

式の結果に基づいて2つのテーブルを内部結合できるようにします。条件付き内部結合

私がこれまでにしようとしてきた何

INNER JOIN CASE WHEN RegT.Type = 1 THEN TimeRegistration ELSE DrivingRegistration AS RReg 
ON 
RReg.RegistreringsId = R.Id 

REGTが参加している私は、これは参加する直前に行わ:

INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 

このSQLスクリプトは動作しません。

したがって、Typeが1の場合は、テーブルTimeRegistrationに参加する必要があります。それ以外の場合は、DrivingRegistrationに参加する必要があります。

ソリューション:

私は次のことを行って、私のSELECT文で参加する:

INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 
LEFT OUTER JOIN TimeRegistration AS TReg ON TReg.RegistreringsId = R.Id AND RegT.Type = 1 
LEFT OUTER JOIN DrivingRegistration AS DReg ON DReg.RegistreringsId = R.Id AND RegT.Type <>1 

をそれから私はこのように、RegTypeに応じて、出力に正しいが、私のwhere-clause編集:

WHERE (CASE RegT.Type WHEN 1 THEN TReg.RegistreringsId ELSE DReg.RegistreringsId END = R.Id) 
+0

、動的SQLを使用することです

CASE RegType.Type WHEN 1 THEN TR.SomeField ELSE DR.someField END as SomeField 

を使用し、あなたの中に句を選び、の今

LEFT JOIN TimeRegistration TR ON r.rid = TR.Id AND RegT.type =1 LEFT JOIN DrivingRegistration DR ON r.rid = DR.Id AND RegT.type <>1 

のJOIN LEFTを使用してクエリに両方のテーブルを入れてみてくださいあなたはそれをすることはできません! 'CASE'は、クエリのランダムな部分を動的に入れ替えるために使用することはできません。これらのテーブルは同じ構造をしていますか? –

+0

エラーが表示されますか?もしそうなら、それは何ですか? – AndrewC

答えて

18

他のオプションは

+0

偉大な心のように見えるデビッド、ちょうどより速く入力してください.... – Sparky

+0

忍者指... – David

+0

素晴らしい、スパイキーとダビデの提案が助け!私の質問を、私がそれを動作させるために行ったことに編集します。 – KristianB

8

おそらく、2つの左結合を実行する必要があります.1つはTimeRegistrationDrivingRegistrationへ1、および適切なからあなたが望むフィールドを返すには、このようなテーブル何か参加:

LEFT JOIN TimeRegistration ON TimeRegistration.RegistreringsId = R.Id 
LEFT JOIN DrivingRegistration ON DrivingRegistration.RegistreringsId = R.Id 

を、あなたは文はこのようなものになるだろう選択:

SELECT CASE WHEN RegT.Type = 1 THEN TimeRegistration.Foo ELSE DrivingRegistration.Bar END 

私は何」のような私はSQLを賢明だとは思わない。

1
SELECT 
    R.foo, tr.bar 
FROM 
    SomeTable AS R 
    INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 
              AND RegT1.Type = 1 
    INNER JOIN TimeRegistration AS tr ON /* whatever */ 

UNION 

SELECT 
    R.foo, dr.bar 
FROM 
    SomeTable AS R 
    INNER JOIN RegistrationTypes AS RegT ON R.RegistrationTypeId = RegT.Id 
              AND RegT1.Type = 2 
    INNER JOIN DrivingRegistration AS dr ON /* whatever */ 
+0

+1おそらく 'UNION ALL'にする必要があります。これらのテーブルがUnion互換である場合、これらは実行計画がどのように見えるかはっきりしないが、 'JOIN'ロジックを繰り返さないようにする' type'カラムを持つCTE内にある可能性があります。 –

+0

@ Martin:正しいインデックスでは、2つの結合が十分に速くなければなりません。私は、2つのターゲットテーブルが異なるので、UNION ALLは必要ないと仮定しました。 – Tomalak