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

连接查询之间的语义差异

勾安翔
2023-03-14
问题内容

我有两个我以为是同一意思的查询,但是我一直得到不同的结果,我希望有人可以解释这些差异如何:

1。

select * 
from table1 a 
left join table2 b on a.Id = b.Id and a.val = 0
where b.Id is null

2。

select * 
from table1 a 
left join table2 b on a.Id = b.Id 
where b.Id is null 
    and a.val = 0

查询的重点是查找表1中的行和val = 0而不是表2中的行。

我也使用sql server 2008,但是我怀疑这是否重要。


问题答案:

在考虑左联接时,应将它们视为具有3个概念阶段。

  1. 应用联接过滤器
  2. 左侧的行又被添加回
  3. 应用where子句。

然后,您将看到为什么得到不同结果的原因。

这也解释了为什么返回结果

select o.* 
from sys.objects o
left join sys.objects o2 on o.object_id=o2.object_id and 1=0

而事实并非如此。

select o.* 
from sys.objects o
left join sys.objects o2 on o.object_id=o2.object_id 
where 1=0


 类似资料:
  • 我刚开始使用普罗米修斯,我正在尝试理解一些事情。 我有一个Java的web应用程序,它公开了一个叫做“my_counter”的计数器。 下面的查询有什么区别? 如果我在1小时的相同时间间隔内运行这些查询,为什么两个查询返回不同的结果? 我试图实现的是看看计数器在一个可配置的时间段内增加了多少。 多谢了。 附注。我实际上使用Grafana来运行查询并选择时间范围。

  • 我计划使用NodeJS api查询大量的数据。使用流api(https://cloud.google.com/nodejs/docs/reference/firestore/0.13.x/Query?#stream)代替常规的查询获取(https://cloud.google.com/nodejs/docs/reference/firestore/0.13.x/Query?#get)有什么好处吗?

  • 本文向大家介绍面向连接的服务和无连接的服务之间的差异。,包括了面向连接的服务和无连接的服务之间的差异。的使用技巧和注意事项,需要的朋友参考一下 这些服务都用于在两个或多个设备之间建立连接。这些服务是网络层的一部分。 面向连接的服务 面向连接的服务就像电话系统。它以建立连接开始,以连接终止结束。该服务使用握手方法在发送方和接收方之间建立连接。 无连接服务 面向连接的服务就像一个邮政系统。它不必建立连

  • 问题内容: 我有一列的数据像 我需要编写一个SQL查询/过程,这将有助于我获取日期之间差异的平均值。对于上面的示例,它将是 (19 + 8 + 10)/3=12.33。 请提供帮助。 在此先感谢Geetha 问题答案: 我不知道您的RDBMS,但这是来自SQL Server。另外,您的计算之一是错误的-02/09/2011-13/08/2011是20,而不是19。 产生的结果是12.667:(20

  • 基本上,我想知道哪种方法更适合练习, 或 或者还有我不知道的更好的方法吗?

  • MongoDB提供了lookup操作,用于实现两个表的关联聚合,但聚合操作编写起来比较麻烦,而且不符合面向对象的思维。为简化开发,bugu-mongo提供了一个JoinQuery类,用于实现两个表的连接查询。 JoinQuery借鉴了SQL左连接的概念: 当前表为左表,被连接的表为右表; 通过指定左键、右键进行关联; 对于不存在关联的数据,只会返回左表的数据,右表的数据为null。 创建JoinQ