考虑两个具有以下模式的表
Raipur_Restaurant_List
RestID
name
其中RestID是primary key
Raipur_Restaurant_List_Dine_Types
RestID
Dine_Name
其中RestID是引用Raipur_Restaurant_List表的foreign key
select distinct RRL.RestID, RRL.name
from Raipur_Restaurant_List as RRL
join Raipur_Restaurant_List_Dine_Types as RRLDT
on RRL.RestID = RRLDT.RestID
where RRLDT.Dine_Name = 'HomeDelivery'
and RRL.RestID
IN (select RestID from Raipur_Restaurant_List_Dine_Types where Dine_Name ='Bakeries')
我使用上面的查询找到那些同时拥有HomeDelivery和Bakeries的餐馆,有没有更好或更有效的方法来实现这个任务?
提前致谢
答案 0 :(得分:2)
使用一个连接而不使用子查询来实现此目的的另一种方法是使用IN ()
匹配两个所需的值,但也实现聚合COUNT()
并限制结果设置为COUNT() = 2
的聚合组,因为这意味着它必须具有两个值:
SELECT DISTINCT
RRL.RestID,
RRL.name
FROM
Raipur_Restaurant_List as RRL
JOIN Raipur_Restaurant_List_Dine_Types as RRLDT
on RRL.RestID = RRLDT.RestID
WHERE
-- Filter for both values
RRLDT.Dine_Name IN ('HomeDelivery', 'Bakeries')
-- GROUP BY is needed to apply the COUNT()
GROUP BY
RRL.RestID,
RRL.name
-- And filter the aggregate groups
-- for those having exactly two, meaning
-- both conditions were matched by the IN ()
HAVING COUNT(DISTINCT RRLDT.Dine_Name) = 2
除了两者之外,IN()
子句本身将返回仅包含HomeDelivery,Bakeries
中的一个或另一个的行。通过应用COUNT()
,您可以确保仅返回与两者匹配的那些。
如果您需要添加其他匹配项,请将它们添加到IN ()
列表中,并将HAVING
子句中要比较的数字增加到与IN ()
的长度相同} list。
只有{em>相同 DISTINCT
每COUNT()
次存在多次才能使用Dine_Name
内的RestID
关键字。如果RestID, Dine_Name
中永远不会有重复的RRLDT
对,那么DISTINCT
就不需要了。
<强> Here is a demonstration... 强>