【问题标题】:In SQL inner Join do we always check for equality?在 SQL 内部联接中,我们总是检查是否相等吗?
【发布时间】:2017-04-30 19:34:22
【问题描述】:

到目前为止,我的印象是,当我们主要通过“内连接”“连接”两个表时,我们测试的条件是相等,例如:

select sales.sales_date, sales.order_id, sales.product_id, product.product_name  from sales INNER JOIN product ON sales.PRODUCT_ID = product.PRODUCT_ID;

并且看过一些解释它的维恩图,比如here

在“内部连接”中,我们是否总是测试条件是否相等?

我试过这个查询,我也能看到一些输出。

select sales.sales_date, sales.order_id, sales.product_id, product.product_name  from sales INNER JOIN product ON sales.PRODUCT_ID != product.PRODUCT_ID;

基于此,我有点困惑“内部连接”的真正含义。

谁能帮我理解这个?

【问题讨论】:

标签: oracle join inner-join


【解决方案1】:

这是一个 SQL 问题,并非特定于 Oracle。在ON 条件中使用相等比较的连接称为equi join。使用不等式(<=>BETWEEN!= 等)的联接称为非等值联接。显然,由于它们甚至有一个技术名称,因此确实存在非 equi 连接。谷歌搜索“non equi join”,你可能会发现很多例子。

连接条件也可以是非算术的;例如,您可以在A.string LIKE B.init_fragment || '%' 上连接表AB - 您在Astring 列中查找所有以Binit_fragment 列中的值开头的字符串。

【讨论】:

  • 感谢您的解释,但是内部连接通常意味着测试是否相等?我提到的大多数材料(即使在各种 SO 问题 - 答案中)都提到内连接意味着两个表匹配基于某个公共字段的条件的那些行集(如上述情况下的 product_id)。我现在对此有点困惑:(
  • @CuriousMind - 通常是的。但是有很多很多情况下,连接不是基于相等性。最好不要认为“join 意味着相等”,即使它“经常”或“通常”意味着相同。如果你从一开始就认为“join 意味着相等”,那么当你看到 non equi joins 时,你会感到困惑。
  • 感谢您的信息,但在我提到的大多数材料中,他们在 INNER JOIN 中说我们测试相等性,只有匹配的记录出现在两个表中;现在如果 INNER JOIN 可以有任何其他子句(除了相等),那将是什么意思?你能推荐一些确定的材料吗?网上能查到这么多不知道哪个是真的,课本上说INNER JOIN就是匹配记录,不知道哪里可以参考真实资料。
【解决方案2】:

在实践中,您最常将外键/主键关系表示为join ... on 子句中的条件,但没有规则要求这样做。

该语法允许您在 join ... on 子句中添加任何条件,您可以在 where 子句中添加任何条件,只要引用的表在范围内(即此时已连接的表)。

join product on 子句中的条件通常会说明需要如何将 product 记录连接到前面提到的表(prices 在您的案子)。从更广泛的意义上说,它告诉引擎可以从结果中消除哪些记录组合,即使 其余表被连接(如果有)。当然,由 SQL 数据库引擎执行优化并决定何时准确应用条件。

【讨论】:

    【解决方案3】:

    不,内连接可以有非等连接条件。任何连接基本上都有两个组件,一个是连接类型(可以是内部、左外、右外、全外等),另一个是如何执行连接(可以是等连接和非等连接)。您可以在这两个组件之间混合和匹配以具有不同类型的连接,例如内等连接、内非等连接等。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2020-01-26
      • 2015-02-22
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2022-11-01
      相关资源
      最近更新 更多