在動網(wǎng)論壇中,用戶登錄以后,論壇菜單下方會多出兩條鏈接,即:"我發(fā)布的主題"和"我參與的主題"。前者的查詢簡單一些,只需要查詢登錄用戶發(fā)布的主題就行,可以寫成"Select 主題 貼子表 where 作者=登錄用戶名"就行了,但后一條就麻煩一些了。這里假使主題貼和回復(fù)貼都是在一個數(shù)據(jù)表中,每條記錄只用一個字段區(qū)分開來是主題貼和回復(fù)貼,我就是這樣做的。我們知道,通常情況下,發(fā)布回復(fù)的時候,是可以省略標(biāo)題的,假使我們?nèi)缜耙粭l一樣搜索的話,得出的搜索結(jié)果中是沒有標(biāo)題這一項的,這樣就無法顯示出來,所以必須顯示該回復(fù)對對應(yīng)的貼子的主題。這個查詢又是怎么來做的呢?
我們先來看一看動網(wǎng)的代碼:
select top 200 * from topic where topicid in ( select top 200 rootid from "&NowUseBBS&" where postuserid="&userid&" order by announceid desc ) order by topicid desc
這個查詢中為什么有小括號呢?是什么意思?且聽在下繼續(xù)分解。
我們一般用到的查詢都是單層查詢,而上面這段查詢卻是兩層,它要求服務(wù)器在處理最終查詢工作之前先生成一個結(jié)果,然后根據(jù)當(dāng)前的查詢結(jié)查再進(jìn)一步繼續(xù)下面的查詢工作,也就是說,先執(zhí)行小括號內(nèi)的查詢(我們稱之為子查詢),然后服務(wù)器才開始執(zhí)行外面的查詢,返回正確的結(jié)果,這種查詢稱為嵌套查詢。上面的這個查詢,第一層查詢是查登錄用戶在本版發(fā)布過的所有貼子(含回復(fù)),然后再查這些貼子的主題。
除了上面這個功用之外,嵌套查詢還有什么好處呢?如果要求在搜索的匹配條件中使用統(tǒng)計函數(shù)(這在分析統(tǒng)計數(shù)據(jù)中經(jīng)常用到),可以使用嵌套查詢。比如說,現(xiàn)在要求查詢所有銷售量大于平均銷售量的書的代號,如果寫成下面的查詢方式:
SELECT title_id,qty //title_id為書號,qty為銷售量 From sales Where qty>avg(qty) //avg為平均數(shù)函數(shù),avg(qty)即為平均銷售量
服務(wù)器將會提示錯誤,因為,在where子句中不許直接對本SELECT列表的數(shù)據(jù)使用統(tǒng)計函數(shù)。通過在where子句中使用嵌套查詢可以解決這個問題,語法如下:
SELECT title_id,qty FROM sales WHERE qty>(SELECT avg(qty) FROM sales)
通過使用多級嵌套查詢,可以實現(xiàn)更復(fù)雜的查詢,如果要在上面查詢的基礎(chǔ)上進(jìn)一步查詢出這些書的書名,就可以使用多級嵌套來實現(xiàn):
SELECT type,title_id,title FROM titles WHERE titles,title_id in ( SELECT title_id FROM sales WHERE qty> ( SELECT avg(qty) FROM sales ) )
出處:MXSky
責(zé)任編輯:風(fēng)狗
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|