2014-09-04 51 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