当前位置: 首页 > 面试题库 >

将条件放入内部联接的ON子句与主查询的where子句之间在逻辑上有区别吗?

吴唯
2023-03-14
问题内容

考虑这两个类似的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

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


问题答案:

对于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


 类似资料:
  • 问题内容: 我今天输入了错误的查询,但它仍然有效,并给出了预期的结果。我的意思是运行此查询: 但是我不小心跑了这个查询 (请注意,而不是最后一个子句中的) 并且都从用户ID返回了正确的员工ID。 这两个查询有什么区别?第二种形式是否仅联接满足条件的2个表的成员,而第一种形式将联接整个表,然后运行查询?一个效率比另一个效率高吗?还有其他我想念的东西吗? 谢谢! 问题答案: 对于这样的内部联接,它们在

  • 问题内容: 有什么区别,每个应该有什么区别? 如果我正确理解该理论,则查询优化器应该可以互换使用。 问题答案: 它们不是同一件事。 考虑以下查询: 和 第一个将返回订单及其订单号的行(如果有)。第二个将返回所有订单,但只有订单将具有与之关联的任何行。 使用,子句 实际上是 等效的。但是,仅仅因为它们在功能上相同而产生相同的结果,并不意味着这两种子句具有相同的语义。

  • 假设您有一个QueryDSL查询,如下所示: 这与下面的(功能)有什么不同? 在我看来,双方都能解决用户所在地必须是梵蒂冈城的问题。此外,这两个对象都返回允许在对象图中导航的对象。 那么有什么区别吗?为什么不直接使用第二个更紧凑的呢? 编辑:他们生成不同的JPQL,这是肯定的,但我不确定最终结果是否有任何不同。我们为什么要明确列出我们正在做什么加入? 编辑2:似乎它们可能是相同的...http:/

  • 问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。

  • 问题内容: 为简单起见,假设所有相关字段均为。 你可以做: 要不然: 这两个工作方式是否相同? 问题答案: 是您应该使用的ANSI语法。 通常认为它更具可读性,尤其是当您连接许多表时。 只要有需要,也可以轻松地将其替换为。 该语法更关系模型为主。 两个表ed的结果是表的笛卡尔积,将对其应用过滤器,该过滤器仅选择连接列匹配的那些行。 使用语法更容易看到这一点。 以您的示例为例,在MySQL(通常在S