Sql-Server-2005
在不使用 Count 函式的情況下檢索行數
我在下面寫了一個查詢,它給我一個語法錯誤,為什麼會這樣做,
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
總之,只有一種有用的方法可以獲取表中的行數。數數(*)