我有3個表A,B和C.在存儲過程中,我已經使用查詢來獲得結果,但我也希望從上面的查詢得到的記錄總數。 這是可能的。我試着用這樣的東西如何統計記錄數以及從查詢中獲取記錄?
Select count(*)
from (
select A.Name,B.Address,C.grade
from A,B,C
where A.id=B.id
AND B.Tlno=C.tlno
)
但是,這是行不通的。
我有3個表A,B和C.在存儲過程中,我已經使用查詢來獲得結果,但我也希望從上面的查詢得到的記錄總數。 這是可能的。我試着用這樣的東西如何統計記錄數以及從查詢中獲取記錄?
Select count(*)
from (
select A.Name,B.Address,C.grade
from A,B,C
where A.id=B.id
AND B.Tlno=C.tlno
)
但是,這是行不通的。
您可以使用窗口函數:
select A.Name,
B.Address,
C.grade,
count(*) over() as total_count
from A,B,C
where A.id=B.id
AND B.Tlno=C.tlno
這將在每一個行返回的總數雖然(但它會爲所有行數相同)。
(1)停止使用舊式x,y,z連接。 (2)你可以在整個結果集上添加一個count(*)over()函數。這是一種浪費,因爲它返回的每一行的計數:
SELECT A.Name, B.Address, C.grade, row_count = COUNT(*) OVER()
FROM dbo.A
INNER JOIN dbo.B ON A.id = B.id
INNER JOIN dbo.C ON B.Tlno = C.tlno;
替代方法是使用@@ ROWCOUNT關鍵字:雖然
SELECT A.Name, B.Address, C.grade, @@rowcount
FROM dbo.A
INNER JOIN dbo.B ON A.id = B.id
INNER JOIN dbo.C ON B.Tlno = C.tlno;
相同的結果窗口功能,讓您得到每行的總數。我很好奇,如果有兩者之間的性能差異......(別在我的當前客戶端具有SHOWPLAN權限不幸)
我認爲這將給每行「1」,否則它將不得不追溯更新自己當查詢完成 – 2012-07-25 12:43:18
它不,我測試了它在本地數據庫。我想它只是在查詢完成後才填充值,就像它應該做反正找到受影響的行的總數一樣...... – pleinolijf 2012-07-25 12:47:38
使用表變量如下
declare @num table (accname varchar(200),subnet varchar(200))
insert into @num(accname,subnet) Select a.accountname,s.subnet from tbl_accounts a,tbl_accountsubnet s where a.accountid=s.accountid
select COUNT(*) from @num;
這對於大的結果可能不明智。 – 2012-07-25 12:55:34
作爲它的SP你可以簡單地輸出或返回@@ rowcount – 2012-07-25 12:23:45