2

我有三个表,我正在展示相同的简化版本

客户_dim

[Cust_id] [Cust_Name]

产品_dim

[Prod_id] [Prod_Name]

Orders_fact

[ord_id] [Cust_id] [Prod_id]

我想要所有购买了每件产品的客户(甚至一个都没有丢失)

我想要一个更优雅的查询,而不是简单地将每个客户组的计数等同于prod_dim

即我不想要以下类型的查询(因为这是一个面试问题,也有一些优雅的点)

select cust_name 
from customers c, 
   (select cust_id, count(prod_id) cnt 
    from order_fact 
    group by cust_id where cnt = (select count(prod_id) from prod_dim)) t1
where c.cust_id = t1.cust_id
4

2 回答 2

2

countgroup by版本:

SELECT Cust_Name FROM Customer_dim WHERE Cust_Id NOT IN (
    SELECT c.Cust_Id FROM Product_dim p
    CROSS JOIN Customer_dim c 
    LEFT JOIN Orders_fact o ON o.Prod_Id = p.Prod_Id AND c.Cust_Id = o.Cust_Id
    WHERE Ord_Id IS NULL
)
于 2013-03-20T14:21:04.930 回答
1

如果你为你的查询使用了正确的语法,那么它可能会在面试中走得更远。这是应该工作的查询版本:

select c.cust_name 
from customers c join
     (select ofa.cust_id 
      from order_fact ofa
      group by ofa.cust_id 
      having cnt = (select count(distinct prod_id) from prod_dim)
     ) ccnt
     on c.cust_id = ccnt.cust_id

注意having子句的使用,count(distinct)而不是count(),正确的连接语法和合理的别名。

于 2013-03-20T14:10:48.947 回答