2013-07-24 18 views
10

SQLコードを改善するには、条件が満たされたときに内部結合を使用する必要があります。私は現在、コード複製しています:SQLが条件を満たす場合に内部結合を実行する

@SystemMerge bit 

if (@SystemMerge=1) 
BEGIN 
    SELECT 
     ....... 
     FROM myTable 
     INNER JOIN table ON table.param1=myTable.param1 
     INNER JOIN systemTable on systemTable.param2=myTable.param2 
    END 
ELSE 
    BEGIN 
     SELECT 
     ....... 
     FROM myTable 
     INNER JOIN table ON table.param1=myTable.param1 
    END 

をし、私はこのような方法でそれをしたいと思っ:

@SystemMerge bit 
BEGIN 
    SELECT 
     ....... 
    FROM myTable 
    INNER JOIN table ON table.param1=myTable.param1 
    ***//the next 4 lines is not working, but this pseudo of what i want:*** 
    if (@SystemMerge=1) 
    begin 
     INNER JOIN systemTable on systemTable.param2=myTable.param2 
    end 

編集: 溶液(@Damien_The_Unbelieverのおかげで):

LEFT JOIN systemTable ON systemTable.param2=myTable.param2 
WHERE 
    ((@SystemMerge=1 AND systemTable.param2 is not null) 
    OR 
    (@SystemMerge=0 OR @SystemMerge is null)) 
+0

私たちには動作しないコードを示してください。あなたが手に入れようとしているエラーは何ではないのですか?おそらくいくつかのデータの例 –

+0

動的SQLを使用したい場合があります – Elmer

+0

条件に基づいて動的クエリを作成し、後でそのクエリをEXEC(クエリ)で実行できます。 –

答えて

10

これは(ほぼ)同じことを行う必要があります。

SELECT 
    ....... 
    FROM myTable 
    INNER JOIN table ON table.param1=myTable.param1 
    LEFT JOIN systemTable on systemTable.param2=myTable.param2 and @SystemMerge = 1 
    WHERE (@SystemMerge = 0 OR systemTable.NonNullableColumn IS NOT NULL) 

もちろん、systemTable内の列への他の参照は、そのような列がNULLであると予想するように記述する必要があります。

+0

私の場合は助けにはなりませんが、将来のニーズにお応えします。ありがとう。 – kobe

+0

+1興味深い – Parado

+0

OK、私は答えを改善し、今それは良い動作します。ありがとう。あなたを選んだ。 – kobe

2

動的SQLについてはどうですか?

declare @sel varchar(max) 

set @sel = ' SELECT 
     ....... 
     FROM myTable 
     INNER JOIN table ON table.param1=myTable.param1 
     ' 

if (@SystemMerge=1) 
    begin 
    set @sel = @sel+'INNER JOIN systemTable on systemTable.param2=myTable.param2' 
    end 

exec(@sel) 
関連する問題