Bad Luck on Subquery

面试碰到这样一道SQL题:

数据库结构如图

2010041416420613.jpg

要求取出

1. Country Name

2. 在这个Country的city count

3. 在这个Country的hotel count

 

当时一想后面题还多着呢, 祭出Subquery 三下五除二, 搞定, 

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
SELECT
Country.Name,
(
SELECT
      
COUNT (City.CityID)
    
FROM
      tblCity City
    
WHERE
      City.CountryID
= Country.CountryID
    )
AS Cities,
(
SELECT
      
COUNT (Hotel.HotelID)
    
FROM
      tblCity City
    
LEFT JOIN tblHotel Hotel
        
ON City.CityID = Hotel.CityID
    
WHERE
      City.CountryID
= Country.CountryID
    )
AS Hotels
FROM
  tblCountry Country
ORDER BY
  Country.Name

 

离开面试公司后, 一直觉得不妥,咋就觉得那是个设好的套让我钻呢.

 

琢磨着用JOIN也能解决这个问题如下:

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
SELECT
Country.Name,
ISNULL (Cities, 0 ) AS Cities,
ISNULL (Hotels, 0 ) AS Hotels
FROM
tblCountry Country
LEFT JOIN
(
SELECT
City.CountryID,
COUNT (Hotel.HotelID) AS Hotels
FROM
tblCity City
LEFT JOIN tblHotel Hotel
ON City.CityID = Hotel.CityID
GROUP BY
City.CountryID
)
AS CountryHotels
ON Country.CountryID = CountryHotels.CountryID
LEFT JOIN
(
SELECT
City.CountryID,
COUNT (City.CityID) AS Cities
FROM
tblCity City
GROUP BY
City.CountryID
)
AS CountryCities
ON Country.CountryID = CountryCities.CountryID

 

 

放在一起比较下Execution Plan, 竟发现Subquery解法的执行效率竟只有JOIN解法的一半.这时才惊醒,原来是上来鬼子的当了.

 

2010041417170720.gif

 

原来, 如果子查询中有使用主查询的字段的话, subquery会执行n次,如果主查询有n的备选结果. 如果子查询没有使用到主查询的字段的话, 子查询只会在执行一次.

 

以此成贴,引以为戒.

转载于:https://www.cnblogs.com/jeffwang/archive/2010/04/14/1712007.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值