1

選択している列の値に基づいて、2 つのテーブルを内部結合できるようにしたいと考えています。

私のクエリ:

SELECT varA, varB, MAX(varC) varC
FROM table1
INNER JOIN table2       ON varB = table2.varB
INNER JOIN @tempTable   ON varA = table1.column
INNER JOIN table3       ON varC = table3.column AND table3.column2 = 1 -- **IF NOT varA = 100**
INNER JOIN table4       ON varC = table4.column  **-- IF varA = 100**
LEFT OUTER JOIN table5  ON table2.column = table5.column AND table5.column2 = 1 AND table5.column3 = 4
GROUP BY varB, varA

したがって、要するに、列 (varA) の値が 100 でない場合は table4 の INNER JOIN であり、それ以外の場合は table3 の INNER JOIN です。

4

3 に答える 3

2

これにより、次の結果が得られると思います。

LEFT JOIN table3       ON varC = table3.column AND table3.column2 = 1 AND varA <> 100 -- **IF NOT varA = 100**
LEFT JOIN table4       ON varC = table4.column  AND varA = 100   **-- IF varA = 100**
...
WHERE (Table3.Column IS NOT NULL OR Table4.Column IS NOT NULL)

基本的に、どちらのテーブルへの結合も許可しますが、それらの結合の 1 つがレコードを見つけた行のみを返します。選択の一部としてテーブルから実際の列を返したい場合は、ISNULL を使用できます。

SELECT ISNULL(Table3.Column, Table4.Column) AS Column

EDIT:動的SQLを使用しない限り、条件付きでテーブルに結合できないことを追加する必要がありました。テーブルに参加することも、しないこともできます。上で概説したことにより、両方のテーブルに結合を実行し、そのうちの 1 つが結合したことを確認できます (これは基本的に内部結合が行うことです)。

于 2012-12-20T00:33:14.630 に答える
1

つまり、varAが100でない場合はtable3のINNER JOIN、それ以外の場合はtable4のINNERJOINです。

これを1つのクエリで効果的に実行することはできません。実行時に、データベースは、行ごとではなく、テーブル全体で実行する結合を決定する必要があります。提案したことを実行しようとすると、せいぜい、データベースがとの両方に参加することにtable3なりtable4ます。最悪の場合、結合はデカルトになります(無制限の「すべての行*すべての行」の結合)。

したがって、次の2つのオプションしかありません。

  1. 両方のテーブルに結合し、行ごとに、その行からデータを生成するtable3table4、その行のデータを生成するかを選択します。
  2. クエリを。で結合された2つのクエリに分割しますUNION。クエリの1つはと結合しtable3、もう1つはと結合しtable4ます。条件を使用して、最初のクエリによって生成される行と2番目のクエリによって生成される行を制御します。つまり、と結合するサブクエリtable3varA != 100WHERE句にあり、と結合するサブクエリは。をtable4持っていvarA = 100ます。
于 2012-12-20T00:25:08.177 に答える
1

あなたの質問は明確ではありません。これがうまくいかない場合は、さらに情報を提供してください。これがあなたの答えだと思います。

結合に CASE ステートメントを配置できます。

更新しました、これを試してください。

INNER JOIN table4 ON (CASE WHEN varA != 100 THEN 1 ELSE 0 END) = 1 AND tablekey=table4key
INNER JOIN table3 ON (CASE WHEN varA = 100 THEN 1 ELSE 0 END) = 0 AND tablekey=table3key
于 2012-12-20T00:01:24.557 に答える