我在YouTube上看到了一段视频,该视频使用Microsoft的How to Easily Map Your Database Schema in Power BI数据库描述了AdventureWorks。现在,我尝试使用另一个数据库复制该示例。问题是我的许多列都有相似的内容,但是不同的列名称带有前缀pk_
或fk_
,这取决于它们位于哪个表中。这导致以下查询失败:
SELECT
c.TABLE_NAME
,c.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN
(SELECT
COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY COLUMN_NAME
HAVING COUNT(*) > 1
) dupes
ON dupes.COLUMN_NAME = c.COLUMN_NAME
有人知道是否可以使列名称模糊匹配或考虑使用不同的前缀来实现此目的?直接向youtube OP询问了同样的问题。也可以在reddit.com上找到它,但是问题仍然没有答案。
我正在尝试将一些更高级的Power BI功能集中起来,同时学习一些急需的SQL,我认为这是一个不错的起点,因此,非常感谢您的帮助!>
答案 0 :(得分:4)
如果要显示表之间的关系,则最好不要在两个表之间使用公共列名。
例如:
CREATE TABLE tab(id INT PRIMARY KEY, name INT);
CREATE TABLE tab2(id2 INT PRIMARY KEY, name INT);
-- completely unrelated tables
SELECT
c.TABLE_NAME
,c.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS c
INNER JOIN
(SELECT
COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY COLUMN_NAME
HAVING COUNT(*) > 1
) dupes
ON dupes.COLUMN_NAME = c.COLUMN_NAME
+-------------+-------------+
| TABLE_NAME | COLUMN_NAME |
+-------------+-------------+
| tab | name |
| tab2 | name |
+-------------+-------------+
我建议使用适当的元数据视图,即sys.foreign_key_columns:
SELECT [table] = tab1.name,
[column] = col1.name,
[referenced_table] = tab2.name,
[referenced_column] = col2.name
FROM sys.foreign_key_columns fkc
JOIN sys.objects obj ON obj.object_id = fkc.constraint_object_id
JOIN sys.tables tab1 ON tab1.object_id = fkc.parent_object_id
JOIN sys.schemas sch ON tab1.schema_id = sch.schema_id
JOIN sys.columns col1 ON col1.column_id = parent_column_id
AND col1.object_id = tab1.object_id
JOIN sys.tables tab2 ON tab2.object_id = fkc.referenced_object_id
JOIN sys.columns col2 ON col2.column_id = referenced_column_id
AND col2.object_id = tab2.object_id;
然后,您需要在PowerBI中选择适当的可视化方法。