Sql server 基于sys.tables的子查询表
我试图检索一个事实表中的所有主键,然后计算该事实表中按该id分组的记录数,但是到目前为止,我似乎只能得到所有主键及其可能的值。我想我需要做一些子查询Sql server 基于sys.tables的子查询表,sql-server,tsql,Sql Server,Tsql,我试图检索一个事实表中的所有主键,然后计算该事实表中按该id分组的记录数,但是到目前为止,我似乎只能得到所有主键及其可能的值。我想我需要做一些子查询 SELECT tab1.name AS [FactTable], col1.name AS [PrimaryKey] FROM sys.indexes ind1 INNER JOIN sys.tables tab1 ON tab1.object_id = ind1.object_id INNER JOIN sys.schemas sch1
SELECT
tab1.name AS [FactTable],
col1.name AS [PrimaryKey]
FROM sys.indexes ind1
INNER JOIN sys.tables tab1
ON tab1.object_id = ind1.object_id
INNER JOIN sys.schemas sch1
ON tab1.schema_id = sch1.schema_id
INNER JOIN sys.columns col1
ON col1.object_id = tab1.object_id AND col1.name like '%Id'
WHERE tab1.name like 'Fact%' AND ind1.is_primary_key = 1
样本输出
primaryKey countRecordsGroupedByPrimaryKey
2 4000
3 8343
4 203
1 4023
如果我理解正确的话,您希望根据某些标准计算某些表中的所有行。我不太清楚您为什么关心主键部分,因为根据定义,主键必须是唯一的,所以这仍然可以简化为不检查主键,而不管是什么 我确实删除了与sys.columns的连接,因为除非您只需要名为Fact%的表和名为%Id的列,否则为什么列的名称很重要 据我所知,这会让你非常接近
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'select TableName = ''' + tab1.name + ''', NumRows = count(*) from ' + QUOTENAME(sch1.name) + '.' + QUOTENAME(tab1.name) + ' UNION ALL '
FROM sys.indexes ind1
INNER JOIN sys.tables tab1
ON tab1.object_id = ind1.object_id
INNER JOIN sys.schemas sch1
ON tab1.schema_id = sch1.schema_id
--INNER JOIN sys.columns col1
-- ON col1.object_id = tab1.object_id AND col1.name like '%Id'
WHERE tab1.name like 'Fact%'
AND ind1.is_primary_key = 1
select @SQL = LEFT(@SQL, LEN(@SQL) - 10) + ' ORDER BY TableName'
select @SQL --uncomment the exec line below once you are comfortable that the dynamic sql is what you want.
--exec sp_executesql @SQL
我想你可能想数一数事实表中使用的每个维度的数量。如果事实表引用了两个不同的维度,则需要两个不同的语句按该维度统计使用情况 对于下面的查询,请提供事实表名称和架构,它应该生成一个计数语句,将事实和dim连接起来,并按连接键进行分组。
-如果事实表有两个不同的FK关系,则会得到两个不同的语句。
-如果表使用复合主键,则两个键列都将包含在联接中 这是复杂的,我没有任何带有多个FK的表来测试它,所以请让我知道它是否符合您的要求
DECLARE @NameOfTableWithFKs sysname = 'your fact table name',
@SchemaOfTableWithFKs sysname = 'dbo';
WITH JoinColumns
AS (SELECT QUOTENAME(OBJECT_SCHEMA_NAME(parent.object_id)) + '.' + QUOTENAME(OBJECT_NAME(parent.object_id)) AS ParentTableName,
QUOTENAME(OBJECT_SCHEMA_NAME(referenced.object_id)) + '.' + QUOTENAME(OBJECT_NAME(referenced.object_id)) AS ReferencedTableName,
QUOTENAME(OBJECT_NAME(parent.object_id)) + '.' + QUOTENAME(parent.name) + ' = ' + QUOTENAME(OBJECT_NAME(referenced.object_id)) + '.'
+ QUOTENAME(referenced.name) AS JoinColumn,
QUOTENAME(OBJECT_NAME(referenced.object_id)) + '.' + QUOTENAME(referenced.name) AS GroupingColumn
FROM sys.foreign_key_columns AS fkc
INNER JOIN sys.columns AS parent
ON parent.object_id = fkc.parent_object_id
AND parent.column_id = fkc.parent_column_id
INNER JOIN sys.columns AS referenced
ON referenced.object_id = fkc.referenced_object_id
AND referenced.column_id = fkc.referenced_column_id
WHERE OBJECT_NAME(parent.object_id) = @NameOfTableWithFKs
AND OBJECT_SCHEMA_NAME(parent.object_id) = @SchemaOfTableWithFKs
),
JoinTables
AS (SELECT QUOTENAME(OBJECT_SCHEMA_NAME(tbl.object_id)) + '.' + QUOTENAME(OBJECT_NAME(tbl.object_id)) AS ParentTableName,
QUOTENAME(OBJECT_SCHEMA_NAME(rtbl.object_id)) + '.' + QUOTENAME(OBJECT_NAME(rtbl.object_id)) AS ReferencedTableName
FROM sys.tables AS tbl
INNER JOIN sys.foreign_keys AS cstr
ON cstr.parent_object_id = tbl.object_id
INNER JOIN sys.tables AS rtbl
ON rtbl.object_id = cstr.referenced_object_id
WHERE OBJECT_NAME(tbl.object_id) = @NameOfTableWithFKs
AND OBJECT_SCHEMA_NAME(tbl.object_id) = @SchemaOfTableWithFKs
)
SELECT 'SELECT Count(*)' + ( SELECT ', ' + JC.GroupingColumn
FROM JoinColumns AS JC
WHERE JC.ParentTableName = jt.ParentTableName
AND JC.ReferencedTableName = jt.ReferencedTableName
FOR XML PATH('')
) + ' FROM ' + JT.ParentTableName + ' INNER JOIN ' + JT.ReferencedTableName + ' ON'
+ SUBSTRING(( SELECT ' AND ' + JC.JoinColumn
FROM JoinColumns AS JC
WHERE JC.ParentTableName = JT.ParentTableName
AND JC.ReferencedTableName = JT.ReferencedTableName
FOR XML PATH('')
), 5, 8000
) + ' GROUP BY ' + SUBSTRING(( SELECT ', ' + JC.GroupingColumn
FROM JoinColumns AS JC
WHERE JC.ParentTableName = JT.ParentTableName
AND JC.ReferencedTableName = JT.ReferencedTableName
FOR XML PATH('')
), 2, 8000
)
FROM JoinTables AS JT;
如果要计算表中的记录(即访问数据,而不是仅仅读取表结构),则必须使用动态sql。在这种情况下,您是否有任何示例或良好的链接,我不太熟悉sql server语法,如果您真正指的是事实表的PK,对PK分组的事实表记录进行计数将返回每一行,计数一次。PK在表中必须是唯一的。你能发布一个你期望看到的示例输出吗?您是否试图确定每个事实表引用了多少个维度?我已经用输出示例进行了更新