如何为每个表计算由 SQL Server 中未指定数量的表共享的列中的不同值?
Posted
技术标签:
【中文标题】如何为每个表计算由 SQL Server 中未指定数量的表共享的列中的不同值?【英文标题】:How to count, for every table, distinct values in a column that is shared by an unspecified number of tables in SQL Server? 【发布时间】:2020-06-03 18:02:41 【问题描述】:我在 SQL Server 数据库中的视图数量不定且不确定,其中有一列名为“CONFIDENCE”。对于该集合中的每个视图,我想计算不同值在该列中出现的频率。
我知道如何找到所有具有“CONFIDENCE”列的视图...
select c.table_schema as schema_name,
c.table_name as name
from information_schema.columns c
join information_schema.tables t
on c.table_name = t.table_name
where c.column_name = 'confidence'
and t.table_type = 'view'
而且我知道如何计算单个视图的不同值...
select distinct confidence,
count(*) as occurrences
from schema.view_name
group by confidence
order by confidence;
但我不知道如何将两者联系起来。我怀疑这与cross apply
或union all
有关,但我只能找到合并固定数量对象的资源。
【问题讨论】:
【参考方案1】:你需要知道一个查询的答案才能编写另一个查询,你可以用一点 DSQL 来解决这个问题。
DECLARE @SQL NVARCHAR(MAX) = ''
SELECT @SQL = @SQL + 'UNION ALL SELECT ''' + c.table_schema + '.' + c.table_name + ''' tbl, confidence, count(*) as occurrences FROM [' + c.table_schema + '].[' + c.table_name + '] GROUP BY confidence
'
FROM information_schema.columns c
JOIN information_schema.tables t ON c.table_name = t.table_name
WHERE c.column_name = 'confidence'
AND t.table_type = 'view'
SET @SQL = RIGHT(@SQL, LEN(@SQL) - 9)
EXEC sp_executesql @SQL
【讨论】:
这几乎可以工作。我如何将所有结果合并到一个结果集中?现在我有 65 个视图,这会输出 65 个结果。 行得通,谢谢!我必须删除 9 个字符,而不是 10 个。 出于好奇,你认为有没有办法在没有动态 sql 的情况下做到这一点? 代码块已编辑。在不使用 DSQL 的情况下,我看不到在 T-SQL 中执行此操作的方法。以上是关于如何为每个表计算由 SQL Server 中未指定数量的表共享的列中的不同值?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server Profiler:如何为“不喜欢”列过滤器指定多个值
EF 5 + SQL Server CE 4:如何为数据库文件指定自定义位置?