在工作中經常看到有人使用with as,查詢很順暢,也很快,很好奇,在網上也有不少資料,看了大神的文章,也練習一下。
首先給出兩位位大神文章的鏈接,介紹十分詳細:http://www.cnblogs.com/fygh/archive/2011/08/31/2160266.html
另一位大神的文章:http://www.cnblogs.com/CareySon/archive/2011/12/12/2284740.html
為了自己更好地理解,還是老實練習一下(概念方面的請參考上面的鏈接):
sql腳本,方便以后隨時練習:

1 create table #Dept 2 ( 3 ID INT, 4 Name nvarchar(30) 5 ) 6 insert #Dept 7 select 1,'上海一區' 8 union all 9 select 2,'蘇州一區' 10 union all 11 select 3,'南京一區' 12 union all 13 select 4,'上海二區' 14 union all 15 select 5,'蘇州二區' 16 union all 17 select 6,'南京二區' 18 19 20 21 create table #Proj 22 ( 23 ID INT, 24 DeptID INT, 25 Name nvarchar(30) 26 ) 27 28 29 insert #Proj 30 select 1,1,'九寨溝旅游' 31 union all 32 select 2,2,'黃山探險' 33 union all 34 select 3,5,'月光碼頭自助' 35 union all 36 select 4,5,'海底撈火鍋' 37 union all 38 select 5,6,'睡大覺' 39 union all 40 select 6,3,'看電影' 41 union all 42 select 7,2,'長白山旅游' 43 union all 44 select 8,5,'香港維多利亞坐船' 45 union all 46 select 9,2,'發獎金啦'
現在的需求是:找出要求部門包含“蘇州”的項目表中的數據,一般來說,這樣的需求一個簡單的子查詢就可以了,如下:
這只是嵌套了一層子查詢,不太復雜,如果多層,可讀性就很差,大神使用了這樣一種方式:
這種方式雖然容易維護,但會帶來性能上的損失,畢竟為了一個查詢建了一張表嘛。
下面隆重祭出CTE:公用表表達式。
使用with as的注意事項,請參看鏈接文章。
來一段遞歸查詢的例子:

1 create table #ff 2 ( 3 ID int, 4 ParentID int, 5 Name nvarchar(20) 6 ) 7 8 insert #ff 9 select 1,0,'江蘇省' 10 union all 11 select 2,1,'蘇州市' 12 union all 13 select 3,2,'高新區' 14 union all 15 select 4,3,'東渚鎮' 16 union all 17 select 5,0,'浙江省' 18 union all 19 select 6,5,'杭州市' 20 union all 21 select 7,6,'蕭山區'
效果圖:
這里要注意一下,union all 后面必須要跟bb.,否則會報錯。