【问题标题】:SQLJoin ResultsSQL 连接结果
【发布时间】:2023-04-02 20:18:02
【问题描述】:
  1. Select * from a join b on a.id=b.id and a.vol

  2. Select * from a join b on a.id=b.id where a.vol

它们产生相同的结果吗?

如果它们产生的结果不同,a 有 1000 行,b 有 100 行,每个会产生多少行?

【问题讨论】:

  • 是的,因为您使用相同的 where 子句限制它们并且它们都是隐式内部连接。

标签: mysql sql sql-server


【解决方案1】:

我会说是的,确实如此。 “Join”意味着“Inner Join”,因此无论是在连接中使用“and”还是在连接后使用“Where”都没有关系。

如果它是“外连接”会有所不同使用外连接表指定“位置”会将连接变成“内连接”或简单的“连接”

希望这是有道理的

【讨论】:

  • where 子句确实很重要。我会从你的答案中删除它。另外,如果有更多的连接条件,连接中的和布尔值会影响结果
  • 我只在问题的上下文中回答,不再假设任何条件。也许您可以在所问的问题中解释为什么它很重要?
  • 您说,由于 OP 使用的是内部联接,因此联接条件中是否有 WHERE 子句或 AND 并不重要。这是不正确的。如果 OP 删除 where 子句,它们的结果将会不同。此外,如果他们使用 AND 添加另一个连接条件,则可能会改变结果
【解决方案2】:

对于INNER JOIN,就像您在这里的简单查询一样,它们是相同的。

对于OUTER JOIN,它们可能不一样。

以这两个查询为例:

select * from orders o left join orderlines ol on ol.order_id = o.id where o.id=12345

和

select * from orders o left join orderlines ol on ol.order_id = o.id and o.id=12345

第一个查询将为您提供订单 #12345 的数据及其行(如果有)。第二个查询将为您提供 所有 个订单的数据,但只有订单 #12345 会有任何商品数据。

这也说明了这两个选项如何具有不同的语义含义。即使它们产生相同的结果,您问题中的两个查询也具有不同的语义,随着应用程序的发展,这可能很重要。

【讨论】:

    【解决方案3】:

    我认为您对答案感到满意,但我想提一下这种用法的另一面。

    这两种方法生成相同的结果,但编译器使用不同的技术来获得结果。

    当然,不同的技术会产生不同的结果。但当 ?很难说明这个状态,但我会尽力解释。

    假设我们有两个表,但第一个表有 isDeleted 列用于记录。此应用程序不会删除行,只是更新 IsDeleted 列并忽略该记录。

    在第一种情况下,如果您没有在 ON 运算符中过滤记录,而是在 where 条件中过滤了它。这些记录将包含在其他联接中,您将计算错误的结果。认为你加入了这个表 Amounts 表。结果是错误的,因为包含了已删除的记录,然后您在 where 条件中对其进行了过滤。

    这种差异会导致非常大的错误,特别是在有很多连接的查询中。

    我希望我能成功解释。我不擅长。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2012-08-15
      • 2010-11-23
      • 2013-04-22
      • 2020-06-19
      • 1970-01-01
      相关资源
      最近更新 更多