SQL Server使用常見問題
阿新 • • 發佈:2022-04-08
分頁查詢
三種方式:
- Top Not IN 方式:查詢靠前的資料較快
- ROW_NUMBER() OVER()方式:查詢靠後的資料速度比上一種較快,在老版本的SQL Server中最常使用
- offset fetch next方式:速度優於前兩者,限制Sql2012以上可以使用
Top Not IN 方式
語法格式:
select top 條數 * from tablename
where Id not in (select top pageSize*(pageIndex-1) Id from tablename)
示例:
SELECT TOP 2 * FROM Users WHERE Id NOT IN (SELECT TOP 2 Id FROM Users)
ROW_NUMBER() OVER()方式
語法格式:
SELECT * FROM (SELECT *,
ROW_NUMBER() OVER(Order by Id ) AS RowNumber from tablename ) as b
where RowNumber between pageIndex-1*pageSize and pageIndex*pageSize
示例:
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber FROM Users ) as b where RowNumber BETWEEN 0 and 3
offset fetch next方式
語法格式:
select * from tablename
order by Id offset pageIndex row fetch next pageSize row only
示例:
select * from Users order by Id offset 2 row fetch next 5 row only
特別地:
1.當存在GROUP BY子句時,查詢的列必須使用聚合函式或者作為分組條件,否則將報錯:
選擇列表中的列 'xxxx' 無效,因為該列沒有包含在聚合函式或 GROUP BY 子句中。
2.當存在GROUP BY子句時,如果此時需要進行分頁處理,則查詢分組總數需要使用一點技巧,不能直接使用select count()
存在GROUP BY子句時,查詢分頁總數大致語法:
SELECT count(1) from
(
SELECT 1 as C from 表名 with(nolock)
where 條件
GROUP BY 分組列
) as TT
示例:
SELECT count(1) from
(
SELECT 1 as C from res with(nolock)
where is_del=0
AND publishtime >= '2022-03-15'
AND publishtime <= '2022-04-07'
GROUP BY bizId,contentId
) as TT
除法計算結果為0的處理
現象:當除數小於被除數時,除法運算結果不保留小數位,直接取整為0。
原因:SQL Server會自動根據除數與被除數的最大精度去對運算結果取精度,如果除數和被除數都是整數,所以得到的結果也是整數。
解決:只要除數與被除數之中有一個是小數,得到的結果也會是小數。手動給被除數加上0.00,即:
select 3/4 -- 結果:0
select 3.0/4 -- 結果:0.750000
【參考】
https://www.jianshu.com/p/d1ae74bda1c5 三種SQLServer分頁查詢語句筆記
https://blog.csdn.net/wh445306/article/details/118567103 sql 除法計算一直 為0原因及解決方案
https://www.cnblogs.com/printn/p/6725026.html 選擇列表中的列……無效,因為該列沒有包含在聚合函式或 GROUP BY 子句中