我有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?
答案 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)
我想,你会想要一些对象来查询。 此外,您还希望动态填充表。
在这种情况下,一个用户定义的函数,其中有一个光标内部循环通过类似的表是你的解决方案的另一个步骤,在视图中使用静态硬编码表
性能可能很糟糕