0

我有 3 张桌子。表 1 和 2 共享第 1 列和第 2 列。所有 3 个表共享第 2 列(一个 ID 列),但只有表 3 包含第 3 列。我希望表 1,2 对第 1 列和第 2 列具有相同值的所有行,但只有其中 table3.Col3(加入 ID 列 2)等于某个特定值“X”。

我有两个查询似乎是相同的,并且正在为我想要的而工作,但我要求专家确保它们是可互换的:

SELECT *
from Table1 INNER JOIN Table2
ON Table1.Col1 = Table2.Col1 and Table1.Col2 = Table2.Col2
WHERE (Select Col3 from Table3 where Table2.Col2 = Table3.Col2) = "X"

SELECT *  
from Table1 INNER JOIN Table2
ON Table1.Col1 = Table2.Col1 and Table1.Col2 = Table2.Col2 
INNER JOIN Table3 
ON Table1.Col2 = Table3.Col2
WHERE Table3.Col3 = "X"
4

1 回答 1

1

我会说是的,它们是等价的,并尝试提供解释。

第一个查询:

第一个INNER JOIN只会从 Table1 和 Table2 中选择两者都Col1匹配Col2的行。子查询实际上是一个相关子查询,它将针对外部子查询的每一行执行,这意味着每一行都被INNER JOIN. 此外,您正在根据内部查询的结果过滤外部查询 where Col3from Table3 = 'X'。这为您提供了您想要的数据。

第二个查询:

稍微不一样。1stINNER JOIN的工作方式与案例 1 相同。但是,您可以INNER JOIN使用 Table3 来设置这个结果。同样,您只加入Table1.Col2 = Table3.Col2. 并且,因为Table1.Col2 = Table2.Col2,它会产生一个等效的中间结果集,如第一种情况下的相关子查询所定义。最后,您在 上进行过滤Table3.Col3 = 'X',这又会产生您想要的确切数据集。

希望这是有道理的。如果我的逻辑错误,请纠正我。

于 2013-10-03T15:11:37.750 回答