【问题标题】:Is inner join the same as equi-join?内连接和等连接一样吗?
【发布时间】:2011-07-25 04:07:09
【问题描述】:

你能告诉我内连接和等连接是否相同吗?

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    答案是否定的。

    等值连接用于使用显式运算符 = 匹配两个表中的两列:

    例子:

    select *
      from table T1, table2 T2
      where T1.column_name1 = T2.column_name2
    

    内连接用于获取两个表之间的叉积,合并两个表中的所有记录。要获得正确的结果,您可以使用等连接或自然连接(表之间的列名必须相同)

    使用等值连接(显式和隐式)

    select *
      from table T1 INNER JOIN table2 T2
      on T1.column_name = T2.column_name
    
    select *
      from table T1, table2 T2
      where T1.column_name = T2.column_name
    

    或者使用自然连接

    select *
      from table T1 NATURAL JOIN table2 T2
    

    【讨论】:

    • 两个表的行数不同,自然连接有影响吗?
    • @Ahmn21与其他任何连接类型的方式相同
    【解决方案2】:

    答案是否定的,这里是为读者简明扼要的。

    内连接可以在连接条件中包含等号 (=) 和其他运算符(如 、)。

    等值连接在连接条件中只有等号(=)运算符。

    Equi join可以是Inner join、Left Outer join、Right Outer join

    【讨论】:

    • equi join 怎么能是左外连接还是右外连接?
    【解决方案3】:

    答案是肯定的,但作为结果集。所以这里是一个例子。

    考虑三个表:

    订单(ord_no、purch_amt、ord_date、customer_id、salesman_id)

    customer(customer_id,cust_name, city,grade, salesman_id)

    salesman(salesman_id, name, city, Commission)

    现在,如果我有这样的查询:

    查找订单详情。

    使用 INNER JOIN:

    SELECT * FROM orders a INNER JOIN customer b ON a.customer_id=b.customer_id 
    INNER JOIN salesman c ON a.salesman_id=c.salesman_id;
    

    使用 EQUI JOIN:

    SELECT * FROM orders a, customer b,salesman c where 
    a.customer_id=b.customer_id and a.salesman_id=c.salesman_id;
    

    执行这两个查询。您将获得相同的输出。

    回答你的问题等值连接和内连接的输出没有区别。但是这两种类型的内部执行可能存在差异。

    【讨论】:

    • 这是不正确的。一种使用 ANSI 92 JOIN 语法 (FROM a JOIN b ON a.x = b.y)。另一个使用非 ANSI 语法 (FROM a, b WHERE a.x = b.y)。但两者都加入a.x = b.y,这使它们成为等值连接因为它们使用等号。非等值连接使用等号以外的运算符。这就是它的全部含义。非等值连接示例:FROM a JOIN B ON a.x <> b.y(不等式连接)、FROM a JOIN b ON a.x BETWEEN b.y AND b.z(范围连接)。
    【解决方案4】:

    简单地说:等值连接是一种可能的内连接类型

    更深入的解释:

    内连接是只返回满足特定条件的连接表中的行的连接。这个条件可能是相等的,这意味着我们会有一个equi-join;如果条件不是相等——可能是不相等、大于、小于、介于等——我们有一个nonequi-join,更准确地说是theta-join。

    如果我们不希望这些条件必须满足,我们可以有 外连接(返回所有表的所有行),左连接(所有行 从左表返回,只匹配右表),右连接 (返回右表的所有行,只匹配左表)。

    【讨论】:

      【解决方案5】:

      一般来说,“内连接”与“等连接”不同。

      'equi-join' 表示使用相等运算符或等效运算符连接表。如果外连接只使用相等,我仍然会称它为“等连接”(其他人可能不同意)。

      'inner join''outer join' 相对,确定没有匹配值时如何连接两个集合。

      【讨论】:

      • 那么,非 EqJoin 是内连接吗?
      • 这是一个很好的解释。是否有正式定义 equi-join 概念的文档或书籍?
      【解决方案6】:

      如果必须做出改变,我想就在这里。我用 DB2 对其进行了测试。 在“等连接”中,您必须选择要连接的表的比较列,在内连接中,您不必这样做。示例:-

      Select k.id,k.name FROM customer k
      inner join  dealer on(
      k.id =dealer.id
      )
      

      这里结果行只有两列行

      id    name
      

      但我认为在 equi join 中你也必须选择其他表的列

      Select k.id,k.name,d.id FROM customer k,dealer d
      where
      k.id =d.id
      

      这将导致三列的行,你不可能在这里没有不需要的经销商比较列(即使你不想要它),行看起来像

       id(from customer) name(from Customer) id(from dealer)
      

      您的问题可能不是这样。但这可能是主要区别之一。

      【讨论】:

      • 不需要的比较列是什么意思?如果你不会在 EqJoin 中选择d.id,那么它也可以工作。
      猜你喜欢
      • 2018-11-30
      • 2013-03-03
      • 2020-06-15
      • 2017-10-22
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多