我有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"
答案 0 :(得分:1)
我会说是的,他们是等同的,并尝试提供解释。
第一次查询:
第一个INNER JOIN
只会从表1和表2中选择Col1
和Col2
匹配的行。子查询实际上是一个相关的子查询,它将对外部子查询的每一行执行,这意味着每一行都由INNER JOIN
过滤。此外,您正在对来自Col3
的{{1}}内部查询结果的外部查询进行过滤。这可以为您提供所需的数据。
第二次查询:
略有不同。第一个Table3 = 'X'
的工作方式与案例1相同。但是,您使用Table3 INNER JOIN
此结果集。同样,您只加入INNER JOIN
行。并且,从Table1.Col2 = Table3.Col2
开始,它会产生由第一种情况下的相关子查询定义的等效中间结果集。最后,您将对Table1.Col2 = Table2.Col2
进行过滤,这会再次生成您想要的精确数据集。
希望这是有道理的。如果我的逻辑错误,请纠正我。