SQL VIEW到多个相同的表

时间:2018-03-27 14:44:49

标签: sql sql-server create-view

我有64个表具有相同的结构。我需要在每个表中查找行数,但我不想单独查询每个表,所以我认为创建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 个答案:

答案 0 :(得分:2)

在这里使用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';获取表名。

答案 1 :(得分: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

答案 2 :(得分:1)

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

如果您只需要按表一次性进行行计数,则可以使用统计信息。

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以确保在运行之前刷新统计信息。

答案 3 :(得分:0)

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

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

性能可能很糟糕