为什么在使用同一个表时需要这个内连接?

时间:2017-11-12 06:08:31

标签: mysql join inner-join

当所有信息都位于一个表中时,为什么必须进行内连接?请解释。只是挂了连接。

如果您正在面试入门级分析师工作(我是),给出以下示例查询和表格描述,您对此信息还有哪些其他观察/问题?

Table: sales_data   
**Field**            **Description**
date             Date of order|
customer_id      Unique ID for Customers|
brand            Unique ID for the brand of a purchased item|
quantity         Quantity of item purchased|
amount           Item Price


select  customer_id, brand, sum(quantity*amount) as sales
from sales_data a
inner join (
                        select          distinct customer_id
                        from                sales_data
                        where               lower(brand) = 'chanel'
                                                and quantity > 0
                                                and date >= to_date('01/01/2017','MM/DD/YYYY')
                    ) b 
on a.customer_id = b.customer_id
where date >= to_date('01/01/2017','MM/DD/YYYY')
    and quantity > 0
group by customer_id, brand

3 个答案:

答案 0 :(得分:0)

如果使用冗余信息在一个表中填充所有数据,有时需要在同一个表中进行内部联接。对于表格描述(您解释过),可以轻松拥有三个不同的表格 - 客户,品牌和具有适当关系密钥的sales_details。而且这种情况不需要自我加入(同一个表中的内部联接)。但由于数据在单个表中可用,因此该要求实际上会导致您必须使用自联接查询。根据查询的输出,显然您需要以下要求步骤 -

  1. 首先,您需要一个与brand ='chanel'
  2. 销售产品的客户清单
  3. 其次,您需要在第一步中为所选客户提供所有产品销售详情。
  4. 为了获得满足上述要求的结果,需要自我加入。

    其他问题:如何重新编写避免内部联接的查询以获得相同的结果?

    Ans:您可以在where语句中使用内部查询,如下所示,以获得相同的结果 -

    select  customer_id, brand, sum(quantity*amount) as sales
    from sales_data a
    where date >= to_date('01/01/2017','MM/DD/YYYY')
    and quantity > 0
    and a.customer_id IN (
        select distinct customer_id
        from sales_data
        where lower(brand) = 'chanel'
        and quantity > 0
        and date >= to_date('01/01/2017','MM/DD/YYYY')
    )
    group by customer_id, brand
    

答案 1 :(得分:0)

是的,你是对的,你可以做一个引用表。 inner join获取特定行,然后计算其sales值。您可以直接执行此操作:

select  customer_id, brand, sum(CASE WHEN and lower(brand) = 'chanel' THEN quantity*amount ELSE 0 END) as sales
from sales_data 
where date >= to_date('01/01/2017','MM/DD/YYYY')
    and quantity > 0
group by customer_id, brand
having MAX(CASE WHEN lower(brand) = 'chanel' THEN 1 ELSE 0 END) = 1;

答案 2 :(得分:0)

您的sales_data表可能包含所有客户销售的数据。所以,假设您想问一个问题,例如:

购买' chanel'的客户的总销售收入是多少?品牌?

您需要做的第一件事是确定所有已购买的客户' chanel'然后你需要去获得他们所有的其他销售额以确定总收入。

内部/子查询完全确定了它已经识别已购买的客户' chanel'品牌自2017年1月1日起。

select          distinct customer_id
from                sales_data
where               lower(brand) = 'chanel'
                        and quantity > 0
                        and date >= to_date('01/01/2017','MM/DD/YYYY')

外部查询然后加入这些客户,并从2017年1月1日起按客户的品牌获得所有具有正数量的销售数据。

select  customer_id, brand, sum(quantity*amount) as sales
from sales_data a
inner join (
          Customers That Purchased 'Chanel'
                    ) b 
on a.customer_id = b.customer_id
where date >= to_date('01/01/2017','MM/DD/YYYY')
    and quantity > 0
group by customer_id, brand

有使用EXISTSIN来完成同样事情的方法。但是,如果IN可能是customer_id,请务必小心NULL