有一家咖啡店出售饮料。 每个杯装的饮料都会被分配一个唯一的ID。
假设咖啡店的所有顾客都有商店的会员ID(所有这些都是唯一的)。
商店的饮料可分为两种类型:咖啡或茶。
现在我有4张桌子。
成员(memberID,memberName)
饮料(bID,customerID)(customerID引用 Member.memberID)< - 每个售出的杯子都有一个饮料实体。
咖啡(coffeeName,bID)(参考Beverage.bID的bID)
茶(teaName,bID)(参考Beverage.bID的bID)
茶和咖啡是饮料的亚型。
此外,每位会员可多次购买不同的饮料。
找到可以显示已购买两种饮料的所有成员的SQL查询 (即不计算只购买一种饮料的会员)。
我已经考虑过这个问题大约半天了......希望有人可以帮助我。
答案 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相同,则客户必须购买了茶和咖啡。