日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SQL點滴之使用with語句來寫一個稍微復(fù)雜sql語句

今天偶爾看到sql中也有with關(guān)鍵字,好歹也寫了幾年的sql語句,居然***次接觸,無知啊??戳艘晃徊┲鞯奈恼?,自己添加了一些內(nèi)容,做了簡單的總結(jié),這個語句還是***次見到,學(xué)習(xí)了。我從簡單到復(fù)雜地寫,希望高手們不要見笑。下面的sql語句設(shè)計到三個表,表的內(nèi)容我用txt文件復(fù)制進去,這里不妨使用上一個隨筆介紹的建立端到端的package的方法將這些表導(dǎo)入到數(shù)據(jù)庫中,具體的就不說了。

創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)新蔡,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

簡單的聚合

從orders表中選擇各個年份共有共有多少客戶訂購了商品

***種寫法,我們可以寫成這樣

 
 
 
 
  1. select YEAR(o.orderdate) orderyear,COUNT(distinct(custid)) numCusts  
  2. from Sales.Orders o  
  3. group by YEAR(o.orderdate)  
  4. go 

 要注意的是如果把group by YEAR(o.orderdata)換成group by orderyear就會出錯,這里涉及到sql語句的執(zhí)行順序問題,有時間再了解一下          

第二種寫法,

 
 
 
 
  1. select orderyear,COUNT(distinct(custid))numCusts  
  2. from (select YEAR(orderdate) as orderyear,custid from sales.orders) as D  
  3. group by orderyear  
  4. go  

在from語句中先得到orderyear,然后再select語句中就不會出現(xiàn)沒有這個字段的錯誤了

第三種寫法,

 
 
 
 
  1. select orderyear,COUNT(distinct(custid)) numCusts  
  2. from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)  
  3. group by orderyear  
  4. go  

在as D后面加上選擇出的字段,是不是更加的清楚明了呢!

第四種寫法,with出場了

 
 
 
 
  1. with c as(  
  2. select YEAR(orderdate) orderyear, custid from sales.orders)  
  3. select orderyear,COUNT(distinct(custid)) numCusts from c group by orderyear  
  4. go  

with可以使語句更加的經(jīng)湊,下面是權(quán)威解釋?! ?br />    
指定臨時命名的結(jié)果集,這些結(jié)果集稱為公用表表達(dá)式 (CTE)。該表達(dá)式源自簡單查詢,并且在單條 SELECT、INSERT、UPDATE、MERGE 或 DELETE 語句的執(zhí)行范圍內(nèi)定義。該子句也可用在 CREATE VIEW 語句中,作為該語句的 SELECT 定義語句的一部分。公用表表達(dá)式可以包括對自身的引用。這種表達(dá)式稱為遞歸公用表達(dá)式?!              ?
                                                ----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  

上面5中寫法都得到相同的結(jié)果,如下圖1:

 

圖1

添加計算

現(xiàn)在要求要求計算出訂單表中每年比上一年增加的客戶數(shù)目,這個稍微復(fù)雜 

 
 
 
 
  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  

這里兩次使用到with結(jié)果集。查詢得到的結(jié)果如下圖2

圖2

復(fù)雜的計算

查找客戶id,這些客戶和所有來自美國的雇員至少有一筆交易記錄,查詢語句如下

 
 
 
 
  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  

這里嵌套with語句,第with語句查找美國雇員的id,第二個語句使用這個結(jié)果和擁有客戶的客戶id和擁有關(guān)系標(biāo)識做笛卡爾積運算。***從這個笛卡爾積中通過標(biāo)識找到最終的custid。

結(jié)果如下圖3

圖3

這里只有簡單地介紹,沒有深入,高手們不要見笑啊。

 

【編輯推薦】

  1. SQL點滴之使用attach功能出現(xiàn)錯誤及解決方法
  2. SQL點滴之一個簡單的字符串分割函數(shù)
  3. SQL點滴之重置win7登錄密碼對SQL登錄的影響
  4. SQL點滴之SSIS中的事務(wù)處理

標(biāo)題名稱:SQL點滴之使用with語句來寫一個稍微復(fù)雜sql語句
網(wǎng)頁地址:http://m.5511xx.com/article/dhdpcge.html