4

考虑这两个相似的 SQL

(ON 子句中的条件)

select t1.field1, t2.field1
from
table1 t1 inner join table2 t2 on t1.id = t2.id and t1.boolfield = 1

(WHERE 子句中的条件)

select t1.field1, t2.field1
from
table1 t1 inner join table2 t2 on t1.id = t2.id
where t1.boolfield = 1

我已经对此进行了一些测试,并且可以看到将条件放在两个不同位置以进行外部连接之间的区别。但是在内部连接的情况下,结果集会有所不同吗?

4

3 回答 3

6

对于 INNER JOIN,没有有效的区别,尽管我认为第二个选项更干净。

对于 LEFT JOIN,有很大的不同。ON 子句指定将从表中选择哪些记录进行比较,而 WHERE 子句过滤结果。

示例 1:返回 tbl 1 中的所有行并将它们与 tbl2 中具有 boolfield=1 的适当行匹配

Select *
From tbl1
  LEFT JOIN tbl2 on tbl1.id=tbl2.id and tbl2.boolfield=1

示例 2:将仅包括 tbl1 中与 tbl2 中具有 boolfield=1 的匹配行的行。它连接表,然后过滤掉不满足条件的行。

Select *
From tbl1
  LEFT JOIN tbl2 on tbl1.id=tbl2.id
WHERE tbl2.boolfield=1
于 2012-07-19T18:59:43.557 回答
2

在您的特定情况下, t1.boolfield 指定了一个附加选择条件,而不是两个表之间匹配记录的条件,因此第二个示例更正确。

如果您正在谈论将匹配记录的条件放在 ON 子句中而不是 WHERE 子句中的情况,请参阅此问题

于 2012-07-19T18:53:14.003 回答
1

两个版本都返回相同的数据。

虽然这对于内部联接是正确的,但对于外部联接却不是这样。

从风格上讲,还有第三种可能性。除了你的两个,还有:

select t1.field1, t2.field1
from (select t1.*
      from table1 t1
      where t1.boolfield = 1
     ) t1 inner join
     table2 t2
    on t1.id = t2.id

哪个更可取取决于您要突出显示的内容,以便您(或其他人)稍后可以理解和修改查询。我通常更喜欢第三个版本,因为它强调查询只使用表中的某些行——布尔条件非常接近指定表的位置。

在另外两种情况下,如果您的查询很长,那么要弄清楚“t1”的真正含义可能会有问题。我认为这就是为什么有些人更喜欢将条件放在 ON 子句中的原因。其他人更喜欢 WHERE 子句。

于 2012-07-19T18:59:41.380 回答