在数据库中使用子查询是否更好?

时间:2015-06-26 18:11:19

标签: mysql subquery

考虑两个具有以下模式的表

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的餐馆,有没有更好或更有效的方法来实现这个任务?

提前致谢

1 个答案:

答案 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>相同 DISTINCTCOUNT()次存在多次才能使用Dine_Name内的RestID关键字。如果RestID, Dine_Name中永远不会有重复的RRLDT对,那么DISTINCT就不需要了。

<强> Here is a demonstration...