1. 程式人生 > 其它 >SQL Server使用常見問題

SQL Server使用常見問題

分頁查詢

三種方式:

  1. Top Not IN 方式:查詢靠前的資料較快
  2. ROW_NUMBER() OVER()方式:查詢靠後的資料速度比上一種較快,在老版本的SQL Server中最常使用
  3. 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 子句中