0

有人将 DB2 数据库迁移到 SQL Server,在迁移过程中所有 PK 和 FK 都丢失了。没有办法让他们回来。

但是多亏了这个查询,我现在能够基于datatypeand对数据库图进行逆向工程column name。(我知道,是基于假设的逆向工程师)。

我现在想使用Chord 视觉对象创建一个 Power BI 仪表板,并在具有相同列名的表之间创建一个链接。(图片只是给你一个想法的例子)

在此处输入图像描述

但我不能使用FromTo因为我没有跟踪变化。

也许我使用了错误的视觉效果?

如何跟踪共同点?

编辑赏金:

如果我对 Adventure Works 运行查询:

WITH ColumnCount AS(
    SELECT s.name AS SchemaName,
           t.name AS TableName,
           c.name AS ColumnName,
           ct.[name] AS DataType,
           c.max_length,
           c.precision,
           c.scale,
           COUNT(c.column_id) OVER (PARTITION BY c.[name], ct.[name], c.max_length, c.precision, c.scale) AS Duplicates
    FROM sys.schemas s
         JOIN sys.tables t ON s.schema_id = t.schema_id
         JOIN sys.columns c ON t.object_id = c.object_id
         JOIN sys.types ct ON c.user_type_id = ct.user_type_id)
SELECT *
FROM ColumnCount CC
WHERE CC.Duplicates > 1
ORDER BY CC.ColumnName,
         CC.SchemaName,
         CC.TableName;

查询可以对具有相同的列进行分组:ColumnName, DataType, max_length, precision, scale

在此处输入图像描述

但是如何在 Power BI Chord 视觉对象中呈现它?

目标是找到表之间的链接。

Chord 似乎是存档它的最佳视觉效果,但如果你有更好的视觉效果来建议我对你的提示持开放态度。

4

1 回答 1

1

要关联 Power BI Chord 视觉对象,您至少需要两个数据点和一个度量;

  • 从(外键表)
  • To(主键表)
  • 关系计数

根据表格的数量,您可能会发现 Chord 图表有点被数据淹没,但是如果您通过 Adventure Works 将这三个值带入,您可以生成

Power BI 和弦图

您开始使用的数据集包含比您需要的更多的信息和行,但自然不包含关系。通过使用以下内容简化数据集,您可以创建 Chord 数据点

WITH ColumnCount AS(
    SELECT  t.name AS TableName,
            c.name AS ColumnName,
            COUNT(c.column_id) OVER (PARTITION BY c.[name],  c.max_length, c.precision, c.scale) AS Duplicates
    FROM  sys.tables t 
         JOIN  sys.columns c ON t.object_id = c.object_id
    WHERE   c.name  like '%Id'
    AND     c.name != 'rowguid'
    
)

SELECT      TableName ForeignTableName,
            LEFT(ColumnName, LEN(ColumnName)-2) PrimaryTableName,
            1 Relationship
FROM        ColumnCount CC
WHERE       CC.Duplicates > 1
AND         LEFT(ColumnName, LEN(ColumnName)-2) != TableName 
ORDER BY    PrimaryTableName, 
            CC.ColumnName,
            CC.TableName

为简单起见,我在上面做了一些假设。

  • 所有外键都以 ID 结尾(以阻止不正确的键匹配,如 ActualCost)

    WHERE c.name like '%Id'

  • Rowguid 不是关系列,因此被排除在外

    AND c.name != 'rowguid'

  • 我们不想要主键表关系到自身

    左(列名,LEN(列名)-2)!= 表名

  • 方案并不重要(因此被删除)

该查询将为您提供如下结果集; Adventure Works 表关系

然后要创建图表,只需将 From、To 和 Values 计数与您的 PrimaryTableName、ForeignTableName 和关系(计数)值相加,如下所示

和弦图配置

为您提供所需的 Power BI Chord 关系图

Power BI 和弦(按字段 ID)

根据您的评论,如果您想做同样的事情,但使用匹配的字段名称(不假设 name[id])来表示您的 fk / pk,那么以下将起作用。我已经包含了一个部分来强制主表,基于主键检查约束,如果你想显示所有关系,你可以注释掉,但要注意你会有数千个,如果你不这样做,它们将是双向的有办法识别主键/表!

    WITH ColumnCount AS(
    SELECT s.name AS SchemaName,
           t.name AS TableName,
           c.name AS ColumnName,
           ct.[name] AS DataType,
           c.max_length,
           c.precision,
           c.scale,
           COUNT(c.column_id) OVER (PARTITION BY c.[name], ct.[name], c.max_length, c.precision, c.scale) AS Duplicates
    FROM sys.schemas s
         JOIN sys.tables t ON s.schema_id = t.schema_id
         JOIN sys.columns c ON t.object_id = c.object_id
         JOIN sys.types ct ON c.user_type_id = ct.user_type_id
         
         )

SELECT cc.TableName + '.' + cc.ColumnName ForeignTableName, cd.TableName + '.' + cd.ColumnName PrimaryTableName, 1 Relationship --,cc.ColumnName, cc.DataType,  cc.Duplicates
FROM ColumnCount CC 
    /*pk only joins - take ths out if you want all joins between fields, not just pk to fk */
    INNER JOIN  INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col on col.COLUMN_NAME = cc.ColumnName
    AND         col.TABLE_NAME = cc.TableName
    INNER JOIN  INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab on     Col.Constraint_Name = Tab.Constraint_Name
    AND Col.Table_Name = Tab.Table_Name
    AND Constraint_Type = 'PRIMARY KEY'
    /*end of pk only joins */

LEFT JOIN ColumnCount Cd on cc.ColumnName = cd.ColumnName
and cc.DataType= cd.DataType
and cc.TableName != cd.TableName
WHERE CC.Duplicates > 1
ORDER BY CC.ColumnName,
         CC.SchemaName,
         CC.TableName;

插入相同的结构,这提供了一个和弦图 来自主键 ID 的和弦关系

于 2021-11-08T12:51:37.260 回答