0

我有 64 个结构相同的表。我需要在每个表中找到行数,但我不想单独查询每一个,所以我认为 create View 显然是......

CREATE VIEW globalResults AS
SELECT 'France' as country, count(RC) as complete FROM tableName1 where RC=18
UNION 
SELECT 'UK' as country, count(RC) as complete     FROM tableName2 where RC=18
UNION
SELECT 'Italy' as country, count(RC) as complete  FROM tableName3 where RC=18
UNION
etc...

有没有更好的解决方案如何创建 VIEW?

4

4 回答 4

2

在这里使用 a 没有错view
union all更有效,因为union将采取不必要的不​​同。
首先只需要列标题。
可以使用count(*).

CREATE VIEW globalResults AS
SELECT 'UK' as country, count(*) as complete FROM tableName2 where RC = 18
union all
SELECT 'France',        count(*)             FROM tableName1 where RC = 18
union all
SELECT 'Italy',         count(*)             FROM tableName3 where RC = 18
...

您可以从select name from sys.tables where type = 'u';.

于 2018-03-27T14:53:26.740 回答
1

假设表格的形式为 tablename1、tablename2、tablename3 等,您可以使用循环遍历每个表格并获得所有计数,如下所示:

create table #holding (country varchar(max), cnt int)
declare @iterator int = 1 

while @iterator<=64 begin
exec('insert #holding select countryname, count(RC) FROM tableName'+@iterator+'  where RC=18
group by countryname')

set @iterator=@iterator+1
end 

select * from #holding
于 2018-03-27T15:01:03.830 回答
1

最好的解决方案可能是在每个表之间创建一个VIEWwith的答案,UNION ALL这样您就可以按需查询(这就是我赞成的地方)。如果您有一些国家名称到表名称的映射,那么动态生成该视图将非常容易。

作为一种替代方法,如果您只需要按表一次计算行数,您可以使用统计信息。

SELECT
    OS.name AS SchemaName,
    O.name AS TableName,
    SUM(S.row_count) AS RecordCount
FROM sys.dm_db_partition_stats S
    INNER JOIN sys.objects O
        ON o.object_id = s.object_id
    INNER JOIN sys.schemas OS
        ON OS.schema_Id = o.schema_id
WHERE S.index_id IN (0, 1) -- Ignore non-clustered indexes
    AND O.type = 'U'
    -- Additional filters for your tables of interest
GROUP BY OS.name, O.name

为了最大限度地提高准确性,也许运行DBCC UPDATEUSAGE (<myDB>) WITH COUNT_ROWS以确保在运行前刷新统计信息。

于 2018-03-27T15:06:11.020 回答
0

我想,你会想要一些对象来查询。此外,您将希望动态填充表格。

在这种情况下,用户定义的函数内部带有一个游标以循环通过类似的表是解决方案的又一步,在视图中使用静态硬编码的表

虽然性能可能很糟糕

于 2018-03-27T14:52:29.107 回答