從數據庫獲取數據時,經常會遇到獲取一個數據列表和該列表中每條數據對應的另一個列表的情況,如果二級列表獲取的是全部數據,那么就比較簡單。如果二級列表獲取的是前n條數據,就會比較麻煩。
從操作上來看,好像很簡單,可以先從數據庫獲取一級列表,然后遍歷,根據指定條件再次獲取二級列表。但是,這樣會多次連接數據庫,嚴重影響從數據庫獲取數據的效率。從效率上考慮,最好是一次全部獲取,這時候可以考慮使用分區函數PARTITION BY。
語法:
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
該語法表示根據COL1分組,在分組內部根據 COL2排序,而此語法計算的值就表示每組內部排序后的順序編號(組內連續、唯一)
示例:
類別表:t_classinfo
classid classname
1 服飾
2 箱包
商品信息表:t_goodsinfo
goodsid goodsname classid ordernum
1 上衣 1 1
2 帽子 1 2
3 褲子 1 3
4 皮夾 2 1
5 錢包 2 2
6 皮帶 2 3
獲取類別列表和每個類別下的兩個商品信息
sql 語句:
select * from t_classinfo select * from (select goodsid,goodsname,(ROW_NUMBER() OVER(PARTITION BY classid ORDER BY ordernum desc)) as rowid from t_goodsinfo) as g where g.rowid<=2 order by classid asc
查詢結果:
classid classname
1 服飾
2 箱包
goodsid goodsname rowid
3 褲子 1
2 帽子 2
6 皮帶 1
5 錢包 2
