如何计算包含相同列的多个表中的记录?

时间:2015-11-19 09:14:32

标签: sql sql-server

我有大约80个表的MS SQL 2012数据库。每个表都有一列UserID,用于标识创建或上次编辑记录的用户。我想编写一个sql语句,它将为我提供所有数据库表中某些userID的已创建/已编辑记录的数量。

例如,UserID = 1的用户是Table1中3条记录的作者和Table2中2条记录的作者。 Sql语句需要给我一个这样的结果:

  • UserID NumberOfRecords
  • 1 5

怎么做?感谢。

3 个答案:

答案 0 :(得分:1)

试试这个,它为数据库中的所有表构建一个动态查询,然后执行它:

DECLARE @sql NVARCHAR(MAX)

SELECT @sql = '(SELECT COUNT(*) FROM QUOTENAME(TABLE_NAME) WHERE user_id = 1) +'
FROM  <DATABASE_NAME>.INFORMATION_SCHEMA.TABLES

SELECT @sql = 'SELECT' + LEFT(@sql, LEN(@sql) - 1) -- remove the last +

--PRINT(@sql) -- we may want to use PRINT to debug the SQL
EXEC(@sql)

在运行之前键入数据库名称而不是<DATABASE_NAME>

答案 1 :(得分:1)

如果您使用的是MS-SQL数据库且所有表都有UserId(int)作为公共列,那么您可以使用此查询来获取结果 - 请尝试以下方法:

    CREATE TABLE #counts
    (
        row_count INT,
        UserID  INT 
    )

    EXEC sp_MSForEachTable @command1='INSERT #counts (row_count,UserId) SELECT COUNT(*),UserId FROM ? GROUP BY UserID '

    SELECT SUM(row_count),userid FROM #counts GROUP BY UserID
    DROP TABLE #counts

谢谢!

答案 2 :(得分:1)

我怀疑“EXEC sp_MSForEachTable”解决方案不起作用,假设数据库中有更多的表,没有那个User Id列,除非您使用try catch块显式处理此类故障。在那种情况下肯定会失败。

这里的解决方案只考虑那些具有所需列的表。

    --To get the List of Table having the required column and Storing them into Temp Table.
Select ID = IDENTITY(Int,1,1),Object_Name(object_id) As TableName Into #ReqTables
From sys.columns where name = 'Crets'

    --Creating Table to Store Row count result.
Create Table #RowCounts
(
    Row_Count Int
    , UserID Int
)

    --Declaring variables
Declare @min Int,@max int,@TableName Nvarchar(255)
    --get min and Max values from Required table for looping
Select @min = Min(Id),@max = Max(ID) From #ReqTables

    --loop through Min and Max
While(@min <= @max)
BEgin
        --get the table for a given loop Counter
    Select @TableName = tableName From #ReqTables Where Id = @min
        --Executing the Dynamic SQl
    Exec ('Insert Into #RowCounts (Row_Count,UserID) Select Count(*),UserID From ' + @TableName + ' Group by UserID')
        --incrementing the Counter
    Set @min = @min + 1
End