標籤:esc div subject 欄位 要求 microsoft 相關 red www
程式預先說明:
本文訪問的資料庫是基於存有RDF三元組的開來源資料庫Localyago修改的庫,其中只有一個表,表中有五個屬性:主語subject、謂語predict、賓語object、主語的編號subid,賓語的編號objid。每條記錄由(subject,predict,object,subid,objid)組成。其中當賓語為字元型而不是實體時(比如“2011”),編號預設為0。有以下資料表:
程式需求:
- 統計每個主語有多少相關的謂語屬性(每個謂語可有多個賓語),即有多少以該實體作為主語的記錄
- 由於結果非常巨大,所以需要將結果儲存到資料庫中的建立的一個表中,並按倒序儲存
具體過程:
- 統計每個主語的謂詞數目,輸出(主語,主語id和主語屬性數目),按每個主語的屬性數目倒序輸出:
select subject, subid, count(subject) as subprenumfrom [Localyago].[dbo].[yago]group by subject,subidorder by subprenum DESC;
group by實現分組統計,這裡按subject分類,由於我們在select的時候選擇了subject和subid,而select中的欄位要麼包含在group by語句裡,要麼被包含在彙總函式裡,所以我們在這裡的group by中也要寫入subid,不然會報錯
order by 是排序,預設從小到大輸出,加上DESC就變成倒序、從大到小輸出
得到如下結果:
2. 將查詢結果的暫存資料表按subprenum倒序存入新的表中,便於儲存和查詢
最基本的方式:
如果新表不存在
select * into 新表 from 舊錶
如果新表不存在
insert into 新表 select * from 舊錶
從而有:
select subject, subid, count(subject) as subprenuminto Localyago.dbo.subprefrom [Localyago].[dbo].[yago]group by subject,subid;order by subprenum;
然後發現雖然我們上一步查詢的結果是有序的,但運行這個之後產生的新表,並沒有按照subprenum排序,順序是亂的。
檢索之後發現這是由於SQL Server自身的局限,如果有特殊需要,要求暫存資料表裡面的資料有序,則可以通過【建立叢集索引】來解決這個問題。具體請參考博文:https://www.cnblogs.com/kerrycode/p/5172333.html
從而改進代碼如下:
select subject, subid, count(subject) as subprenuminto Localyago.dbo.subprefrom [Localyago].[dbo].[yago]where 1=0group by subject,subid;create clustered index inx_subpre on Localyago.dbo.subpre(subprenum DESC);--建立叢集索引,按subprenum倒序排序insert into Localyago.dbo.subpre select subject, subid, count(subject) as subprenum from [Localyago].[dbo].[yago] where subid !=0 group by subject,subid order by subprenum;
這樣運行之後得到的新表subpre裡的記錄就是按照subprenum倒序排序了
如下:
【SQL Server 2012】按倒序儲存“分組統計”結果的暫存資料表到建立表