2014-09-04 16 views
0

我知道這是我與連接的錯誤,但不知道爲什麼我得到多行和錯誤的行數?雙連接導致重複的記錄和不正確的行數

我的TSQL:

DECLARE @PeopleIDTables TABLE (Column_Name varchar(500) NULL, Table_Name varchar(500) NULL) 

INSERT INTO @PeopleIDTables 
    SELECT COLUMN_NAME + ',', TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE 'People_ID' 
    ORDER BY TABLE_NAME 

--SELECT * FROM @PeopleIDTables 


SELECT PIT.Table_Name, I.rows NumberRows 
FROM @PeopleIDTables PIT 
JOIN sys.tables T ON PIT.Table_Name = T.name 
JOIN sys.sysindexes I ON T.object_id = I.id 

這裏是我的結果摘錄:

PEOPLE 770438 
PEOPLE 770438 
PEOPLE 770438 
PEOPLE 770438 
PEOPLE 770438 
PEOPLE 770438 
PEOPLE 770438 
PEOPLE 0 

時候其實有這樣的開發系統上只有一個DB,它只有一個人表? 查詢的前半部分準確返回具有People_Id列的64個表。

請幫忙。

謝謝

+1

我要猜測至少「PEOPLE」表有多個索引。而且你在桌面上有一對多的索引,導致比我想的更多的記錄。 「[對於當前數據庫中的每個索引和表都包含一行,此視圖不支持XML索引,此視圖中不完全支持分區表和索引;請改爲使用sys.indexes目錄視圖。](http:/ /msdn.microsoft.com/en-us/library/ms190283.aspx)「 – xQbert 2014-09-04 18:53:24

+0

是多個索引....對不起,我沒想過要先檢查... DOH! – GPGVM 2014-09-04 19:02:23

回答

1

也許你的意思是......

SELECT PIT.Table_Name, Max(I.rows) NumberRows 
FROM @PeopleIDTables PIT 
JOIN sys.tables T ON PIT.Table_Name = T.name 
JOIN sys.sysindexes I ON T.object_id = I.id 
GROUP BY PIT.Table_Name 

我想你想的最大行數,作爲指數可以在建或需要在更新..這裏的行數不總是100 %準確。

+1

實際上,使用sys.partitions比舊的向後兼容性sysindexes視圖要安全得多,並且要使用SUM並且只能在index_id 0或1上使用。分區表對於不同的分區將有不同的行,並且MAX()不會是精確的圖表中的行數 - 只有最大的分區。 – 2014-09-04 19:26:31

+0

http://blogs.msdn.com/b/martijnh/archive/2010/07/15/sql-server-how-to-quickly-retrieve-accurate-row-count-for-table.aspx提供了幾種方法來完成這一點。由於我不確定最終的比賽結果是什麼,我不知道是否需要關於索引的信息。 – xQbert 2014-09-04 19:45:39