7

適切に検索し損ねたかどうかはわかりませんが、正確な質問を得ることができませんでした。

これは似たようなものですが、正確ではありません

https://stackoverflow.com/questions/11533636/determining-which-table-to-join-to

実際には、ストアド プロシージャに渡されたパラメータに基づいて結合するテーブルを決定したいのですが、case whenうまくいきませんでした

すこし

select * from Table1 
       left join (case when @Parameter<>NULL Then Table2 else Table3 end) final
       on Table1.Col1 = final.Col1

Table2 と Table3 は同じ構造です

4

2 に答える 2

7

いくつかのオプションを考えることができます:

1:IF ... ELSE

IF @Parameter IS NULL

  SELECT *
  FROM T1
    INNER JOIN T2 ON T1.ID = T2.ID

ELSE

  SELECT *
  FROM T1
    INNER JOIN T3 ON T1.ID = T3.ID

2: 動的 T-SQL

DECLARE @SQL NVARCHAR(MAX);

SELECT @SQL = N'SELECT *
  FROM T1
    INNER JOIN ' + CASE WHEN @Parameter IS NULL THEN N'T2 t' ELSE N'T3 t' END
  + N' ON T1.ID = t.ID';

EXEC sp_executesql @SQL;

3: UNION ALL とサブクエリ。

  SELECT *
  FROM T1
    INNER JOIN
    (
      SELECT *
      FROM T2
      WHERE @Parameter IS NULL
      UNION ALL
      SELECT *
      FROM T3
      WHERE @Parameter IS NOT NULL
    ) t ON T1.ID = t.ID

この最後のものについては、オプティマイザが作成する計画をチェックして、パフォーマンスが問題ないかどうかを確認する必要があります。

コードの再利用をお探しのようですので、おそらくオプション 2 が最適です。T-SQL は、この種のポリモーフィズムにはあまり適していませんが、場合によっては回避策を使用できます。

一歩下がって、1 つの質問は、テーブルが同じ構造を持っている場合、1 つのテーブルだけを使用する必要があるかどうかです。次に@Parameter、動的クエリを作成する代わりに、必要な行をフィルタリングするために使用できます。

このような状況では、ORM などを使用してアプリケーション層でコード生成を処理できることも注目に値します。

于 2013-04-13T15:57:08.563 に答える
1

これを試して:

select *
from (
  select data.*,
    case when selection=1 then t1.ExtraField
         when selection=2 then t2.ExtraField
         when selection=3 then t3.ExtraField
         else NULL
    end as ExtraField
  from data
  left join t1 on t1.key = data.key and selection=1
  left join t2 on t2.key = data.key and selection=2
  left join t3 on t3.key = data.key and selection=3
) T
where ExtraField is not NULL
于 2013-04-13T16:01:31.290 に答える