请求SQL查询对我来说非常困难

时间:2011-10-27 11:34:13

标签: sql

有一家咖啡店出售饮料。 每个杯装的饮料都会被分配一个唯一的ID。

假设咖啡店的所有顾客都有商店的会员ID(所有这些都是唯一的)。

商店的饮料可分为两种类型:咖啡或茶。

现在我有4张桌子。

  • 成员(memberID,memberName)

  • 饮料(bID,customerID)(customerID引用 Member.memberID)< - 每个售出的杯子都有一个饮料实体。

  • 咖啡(coffeeName,bID)(参考Beverage.bID的bID)

  • 茶(teaName,bID)(参考Beverage.bID的bID)

茶和咖啡是饮料的亚型。

此外,每位会员可多次购买不同的饮料。

找到可以显示已购买两种饮料的所有成员的SQL查询 (即不计算只购买一种饮料的会员)。

我已经考虑过这个问题大约半天了......希望有人可以帮助我。

5 个答案:

答案 0 :(得分:7)

select
  memberID
from
  Member
where
  memberID IN (select customerID
                 from Beverage inner join Coffee on Beverage.bID = Coffee.bID)
AND
  memberID IN (select customerID
                 from Beverage inner join Tea on Beverage.bID = Tea.bID)

或使用EXISTS

select
  memberID
from
  Member
where
  exists (select *
            from Beverage inner join Coffee on Beverage.bID = Coffee.bID
           where Beverage.customerID = Member.memberID)
AND
  exists (select *
            from Beverage inner join Tea on Beverage.bID = Tea.bID
           where Beverage.customerID = Member.memberID)

根据数据集,EXISTS变体可能更快。假设存在必要的索引,这将允许优化器在评估存在检查时快捷方式。

答案 1 :(得分:4)

您可以直接加入两个表,任何不购买这两种类型的成员都将被加入排除..

select
  distinct m.memberID
from
  Member m 
  INNER JOIN Beverage b ON  m.memberID = b.customerID
  INNER JOIN Beverage b1 ON m.memberID = b1.customerID
  INNER JOIN Coffee c ON b.bID = c.bID
  INNER JOIN Tea t ON b1.bID = t.bID

答案 2 :(得分:2)

SELECT DISTINCT m.memberName
FROM Member m
  INNER JOIN (
    SELECT b1.customerID 
    FROM Beverage b1
      INNER JOIN Coffee c ON b1.bID = c.bID
  ) bc ON m.memberID = bc.customerID
  INNER JOIN (
    SELECT b2.customerID 
    FROM Beverage b2
      INNER JOIN Tea t ON b2.bID = t.bID
  ) bt ON m.memberID = bt.customerID

答案 3 :(得分:0)

Select Distinct m.MemberName,m.MemerID from Member m 
where m.MemerID In
    (Select     b1.CustomerID
    FROM Beverage b1 InnerJoin Coffee c On b1.bID=c.bID
    where b1.CustomerID In
        (Select b2.CustomerID
        From Beverage b2 InnerJoin Tea t On b2.bID=t.Bid))

答案 4 :(得分:0)

只是在寻找一些困难的查询,然后这个问题突然出现了(不是很难,但是我尝试了一下),所以我只展示我的解决方案:

_aircrafts-list.html.erb
_home-search-list.html.erb

如果您需要获取客户名称,只需在客户id = memeberid上添加一个联接即可。

在此解决方案中,您将找到购买至少1杯咖啡的所有客户,然后查找所有购买至少1杯茶的所有客户。现在,从这两组客户群中,您只选择了一个对交集具有相同性的对象。如果两个组中的ID相同,则客户必须购买了茶和咖啡。