【问题标题】:Inner join Order内连接顺序
【发布时间】:2016-07-12 18:09:19
【问题描述】:

我有三个表 - A、B 和 C,每个表分别包含 2012、2013 和 2014 年的活跃客户列表。我想获得在所有三年中都很活跃的客户列表。我是这样做的:

select distinct customer_id
from table_A a
inner join table_B b on a.customer_id=b.customer_id
inner join table_C c on a.customer_id=c.customer_id

但这会产生与此不同的结果吗:

select distinct customer_id
from table_A a
inner join table_B b on a.customer_id=b.customer_id
inner join table_C c on b.customer_id=c.customer_id

谢谢!

【问题讨论】:

    标签: mysql sql teradata proc


    【解决方案1】:

    inner join 的连接顺序没有区别。

    但是,如果其中一个表是一个“主”表,每个 customer_id 有一行,那么这样做效率更高:

    select a.customer_id
    from table_A a
    where exists (select 1 from table_B b where a.customer_id = b.customer_id) and
          exists (select 1 from table_C c on a.customer_id = c.customer_id);
    

    这消除了select distinct 的重复缩减。

    【讨论】:

    • 谢谢!我不确定订单是否有所作为。非常感谢您的回答!
    【解决方案2】:

    不,因为您正在执行内部连接。内连接是一个交集,所以只有 3 个中的 id 才能通过,无论您将连接放在一起的顺序如何。如果你做一个外连接,你必须更担心顺序。

    【讨论】:

    • 谢谢!我知道这似乎是一个基本问题,我可以自己尝试一下,但是这个想法是在我无法访问 SQL 的家里产生的。
    【解决方案3】:

    不,它不应该是不同的结果,因为内部连接是一个交集。

    这是一个例子。 "empid" 1 & 2 是工作满 3 年的员工。

    mysql> select * from t2012;
    +-------+
    | empid |
    +-------+
    |     1 |
    |     2 |
    |     3 |
    +-------+
    3 rows in set (0.00 sec)
    
    mysql> select * from t2013;
    +-------+
    | empid |
    +-------+
    |     1 |
    |     2 |
    |     3 |
    |     4 |
    +-------+
    4 rows in set (0.00 sec)
    
    mysql> select * from t2014;
    +-------+
    | empid |
    +-------+
    |     1 |
    |     2 |
    |     4 |
    |     5 |
    
    mysql> select distinct a.empid from t2012 a 
    inner join t2013 b on a.empid = b.empid 
    inner join t2014 c on a.empid=c.empid;
    +-------+
    | empid |
    +-------+
    |     1 |
    |     2 |
    +-------+
    2 rows in set (0.00 sec)
    
    mysql> select distinct a.empid from t2012 a
     inner join t2013 b on a.empid = b.empid
     inner join t2014 c on b.empid=c.empid;
    +-------+
    | empid |
    +-------+
    |     1 |
    |     2 |
    +-------+
    2 rows in set (0.00 sec)
    

    【讨论】:

      【解决方案4】:

      如果您只想要所有三个表中都存在的客户,您也可以使用集合操作:

      select customer_id from table_A
      INTERSECT
      select customer_id from table_B
      INTERSECT
      select customer_id from table_C
      

      没有明确的DISTINCT,但设置操作默认为它,优化器知道如何最有效地做到这一点。

      当然,根据实际数据/索引,Gordon 使用EXISTS 的答案可能会更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-06
        • 2017-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        • 2015-06-19
        相关资源
        最近更新 更多