Sql-Server-2005

在不使用 Count 函式的情況下檢索行數

  • December 20, 2019

我在下面寫了一個查詢,它給我一個語法錯誤,為什麼會這樣做,

SELECT MAX('Row') FROM 

(SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) 'Row' FROM USERS)

錯誤描述:

Incorrect syntax near ')'.

我不明白:(

查詢實際上存在三個問題。第一個Max('Row')將返回字元串’Row’。第二個是您的子查詢需要一個別名。

試試這樣:

SELECT MAX(Row) FROM 
(SELECT ROW_NUMBER() OVER(ORDER BY ID DESC) Row FROM USERS) UserQuery

第三個問題是,正如 gbn的回答count()中專業描述的那樣,這是一種更好的方法。

另請注意,ROW它在保留關鍵字列表中,因此也應避免。

  • 如果您想以有效的方式獲得確切的行數,那COUNT(*)就是它。ANSI 標準(查找“ ” Scalar expressions 125)規定COUNT(*)了表的行數:它旨在從一開始就進行優化。

如果指定了 COUNT(*),則結果是 T 的基數。

  • ROW_NUMBER() 函式不是一個實用的選項:它不是一個計數函式(它是“ROW_NUMBER”),當你添加行時它會執行得很糟糕:幾個 1000 會顯示它有多糟糕
  • SUM(1) 可以在內部優化為 COUNT(*) 但我永遠不會使用它
  • @@ROWCOUNT 將要求第一個 SELECT 返回所有行,這是一個巨大的不必要的成本。

如果您可以使用 SQL Server 的近似值,請使用 sys.dm_db_partition_stats。自從 SQL Server 2005 添加了 dmvs 以來,瑪麗安的答案現在已經過時了

SELECT
  Total_Rows= SUM(st.row_count)
FROM
  sys.dm_db_partition_stats st
WHERE
   object_name(object_id) = 'Mytable' AND (index_id < 2)

有關更多資訊,請參見 SO 上的此內容:https ://stackoverflow.com/questions/6069237/fastest-way-to-count-exact-number-of-rows-in-a-very-large-table/6069288# 6069288

總之,只有一種有用的方法可以獲取表中的行數。數數(*)

引用自:https://dba.stackexchange.com/questions/3849