1

我希望能够根据我选择的列的值内部连接两个表。

我的查询:

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)

基本上允许连接到任一表,但只返回其中一个连接找到记录的行。如果您想从表中返回实际列作为选择的一部分,那么您可以使用 ISNULL:

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

编辑:我应该补充一点,除非你想使用动态 SQL,否则你不能有条件地加入表。您可以加入或不加入表。我上面概述的内容让您可以对两个表进行连接,然后检查其中一个是否连接(这基本上是内部连接所做的)。

于 2012-12-20T00:33:14.630 回答
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 回答
1

因此,简而言之,如果 varA 不是 100,则在 table3 上进行 INNER JOIN,否则在 table4 上进行 INNER JOIN。

这不能在一个查询中有效地完成。在执行时,数据库必须决定在整个表的基础上执行哪些连接,而不是逐行执行。如果您尝试按照您的建议进行操作,那么您将得到的充其量是数据库将同时加入table3table4. 在最坏的情况下,连接将是笛卡尔连接(不受限制的“所有行 * 所有行”连接)。

所以你只有这两个选择:

  1. 加入两个表,并逐行选择是从该行生成数据table3还是table4为该行生成数据。
  2. 将查询拆分为两个由 连接的查询UNION。其中一个查询与 连接table3,另一个与 连接table4。您使用条件来控制第一个查询生成哪些行,第二个查询生成哪些行;即,在 WHERE 子句中与 has 连接的子查询,与 has 连接的table3子查询。varA != 100table4varA = 100
于 2012-12-20T00:25:08.177 回答