【问题标题】:SQL Server: differences between "in" and "join" syntax?SQL Server:“in”和“join”语法之间的区别?
【发布时间】:2021-05-17 04:43:40
【问题描述】:

我以为下面显示的两个 SQL 语句在功能上是相同的,但显然我错了,因为它们返回的结果不同。

谁能解释一下?

select count(*) 
from t 
where t.id in (select distinct v_id from v)

select count(*) 
from t 
join v on t.id = v.v_id

【问题讨论】:

  • 技术上的区别在于IN是一个半连接,它只是返回一个是/否来判断是否匹配。顺便说一句,distinct 是不必要的,一个好的优化器会忽略它。
  • 您会更好地理解这一点,只需简单地删除计数,将所有表的主键列(实际上只需要 PK 列)添加到选择列表中,适当地排序,然后简单地比较结果集。

标签: sql sql-server tsql join inner-join


【解决方案1】:

JOIN 可以通过两种方式更改查询中的行数:

  1. 当值不匹配时,将过滤掉行。
  2. 当表有重复时,结果集中有这些重复。

IN 过滤掉不匹配的值。但是,如果 v 有重复项,它不会生成重复项。如果结果不同,则表明v 与v_id 有重复。

【讨论】:

    【解决方案2】:

    让我们试着用简单的话来解释。 如果 t.id 在表 v

    中,第一个查询将从 t 返回 count(*)

    但是第二个查询将首先连接两个带有 id 和 v_id 的表。然后它将从他们的连接表中返回计数。

    例如,如果 t 有 1、2 和 1 作为 id,而 v 有 1 和 2 作为 id

    select count(*) from t where t.id in (select distinct v_id from v)
    and 
    select count(*) from t join v on t.id = v.v_id
    

    两个查询都将返回与 count: 3 相同的结果

    select count(*) from v where t.v_id in (select distinct id from t)
    and 
    select count(*) from t join v on t.id = v.v_id
    

    会返回不同的结果。第一个查询将返回 2,但第二个查询将返回 3。

    如果表中有重复值,join可以增加行数。

    【讨论】:

      猜你喜欢
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2011-02-18
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多