從這里下載文件employees.txt,customers.txt,orders.txt
參考文章:http://www.cnblogs.com/wwan/archive/2011/02/24/1964279.html
使用package導(dǎo)入數(shù)據(jù):http://www.cnblogs.com/tylerdonet/archive/2011/04/17/2017471.html
簡(jiǎn)單的聚合
從orders表中選擇各個(gè)年份共有共有多少客戶訂購了商品
1select YEAR(o.orderdate) orderyear,COUNT(distinct(custid)) numCusts
2from Sales.Orders o
3group by YEAR(o.orderdate)
4go
1select orderyear,COUNT(distinct(custid))numCusts
2from (select YEAR(orderdate) as orderyear,custid from sales.orders) as D
3group by orderyear
4go
1select orderyear,COUNT(distinct(custid)) numCusts
2from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)
3group by orderyear
4go
1with c as(
2select YEAR(orderdate) orderyear, custid from sales.orders)
3select orderyear,COUNT(distinct(custid)) numCusts from c group by orderyear
4go
----MSDN
1 with c(orderyear,custid) as(
2 select YEAR(orderdate),custid from sales.orders)
3 select orderyear,COUNT(distinct(custid)) numCusts from c group by c.orderyear
4 go
添加計(jì)算
1 with yearcount as(
2 select YEAR(orderdate) orderyear,COUNT(distinct(custid)) numCusts from sales.orders group by YEAR(orderdate))
3 select cur.orderyear curyear,cur.numCusts curNumCusts,PRv.orderyear prvyear,prv.numCusts prvNumCusts,cur.numCusts-prv.numCusts growth
4 from yearcount cur left join yearcount prv on cur.orderyear=prv.orderyear+1
5 go
復(fù)雜的計(jì)算
1 with TheseEmployees as(
2 select empid from hr.employees where country='USA'),
3 CharacteristicFunctions as(
4 select custid,
5 case when custid in (select custid from sales.orders as o where o.empid=e.empid) then 1 else 0 end as charfun
6 from sales.customers as c cross join TheseEmployees as e)
7 select custid,min(charfun) from CharacteristicFunctions group by custid having min(charfun)=1
8 go
這里只有簡(jiǎn)單地介紹,沒有深入,高手們不要見笑啊。
---------------------------------------------------------分界線----------------------------------------------------------
with語句和子查詢的性能比較
在博友SingleCat的提醒下,對(duì)with語句做一些性能測(cè)試,這里使用的測(cè)試工具是SQL Server Profile。我選擇了最后一個(gè)語句,因?yàn)檫@個(gè)語句比較復(fù)雜一點(diǎn)。開始的時(shí)候單獨(dú)執(zhí)行一次發(fā)現(xiàn)他們的差別不大,就差幾個(gè)毫秒,后來想讓他們多執(zhí)行幾次,連續(xù)執(zhí)行10 次看看執(zhí)行的結(jié)果。下面貼出測(cè)試用的語句。
2 declare @withquery varchar(5000)
3 declare @execcount int=0
4 set @withquery='with TheseEmployees as(
5 select empid from hr.employees where country=N''USA''),
6 CharacteristicFunctions as(
7 select custid,
8 case when custid in (select custid from sales.orders as o where o.empid=e.empid) then 1 else 0 end as charfun
9 from sales.customers as c cross join TheseEmployees as e)
10 select custid from CharacteristicFunctions group by custid having min(charfun)=1 order by custid
11 '
12 while @execcount<10
13 begin
14 exec (@withquery);
15 set @execcount=@execcount+1
16 end
17
18 /*子查詢*/
19 declare @subquery varchar(5000)
20 declare @execcount int=0
21 set @subquery='select custid from Sales.Orders where empid in
22 (select empid from HR.Employees where country = N''USA'') group by custid
23 having count(distinct empid)=(select count(*) from HR.Employees where country = N''USA'');
24 '
25 while @execcount<10
26 begin
27 exec (@subquery);
28 set @execcount=@execcount+1
29 end
從SQL Server Profile中截圖如下
從圖中可以看到子查詢語句的執(zhí)行時(shí)間要少于with語句,我覺得主要是with查詢中有一個(gè)cross join做了笛卡爾積的關(guān)系,于是又實(shí)驗(yàn)了上面的那個(gè)簡(jiǎn)單一點(diǎn)的,下面是測(cè)試語句。
1 /*with語句*/
2 declare @withquery varchar(5000)
3 declare @execcount int=0
4 set @withquery='with c(orderyear,custid) as(
5 select YEAR(orderdate),custid from sales.orders)
6 select orderyear,COUNT(distinct(custid)) numCusts from c group by c.orderyear'
7 while @execcount<100
8 begin
9 exec (@withquery);
10 set @execcount=@execcount+1
11 end
12
13 /*子查詢*/
14 declare @subquery varchar(5000)
15 declare @execcount int=0
16 set @subquery='select orderyear,COUNT(distinct(custid)) numCusts
17 from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)
18 group by orderyear'
19 while @execcount<100
20 begin
21 exec (@subquery);
22 set @execcount=@execcount+1
23 end
這次做10次查詢還是沒有多大的差距,with語句用10個(gè)duration,子查詢用了11個(gè),有時(shí)候還會(huì)翻過來。于是把執(zhí)行次數(shù)改成100,這次還是子查詢使用的時(shí)間要少,截圖如下
最終結(jié)論,子查詢好比with語句效率高。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注