在一个 SELECT 中将主表的数据连接到键/值表数据
Posted
技术标签:
【中文标题】在一个 SELECT 中将主表的数据连接到键/值表数据【英文标题】:Join master table's data to a key/value table data in one SELECT 【发布时间】:2015-06-17 14:12:27 【问题描述】:我有一个名为 Contacts
的表,其中包含列
-
身份证
名字
姓氏
我有另一个名为ContactsExtra
的表。它有以下列:
-
身份证
ContactId(FK 是指联系人 ID)
PropertyId(FK 指的是 Properties Id)
属性值
这是一个存储一些额外联系人属性的键/值表。例如。如果联系人具有 Salary 属性,则此表中有一条记录所有 Contacts 存储 Salary 值。
所有属性(无论它们是否在主Contacts
表中)都存储在一个名为Properties
的单独表中。在此表中,来自Contacts
(名字和姓氏)的属性被锁定。但是用户可以添加或删除自定义属性(这些没有锁定)。这些新属性的值将存储在ContactsExtra
。
Properties
表包含以下列:
-
身份证
姓名
我想做的是使用一个 SELECT 显示所有联系信息。所以例如在上述情况下,会有一个包含 Id、FirstName、LastName 列以及 Salary 列的结果。前三个来自联系人,最后一个来自键/值表。如何将这些信息结合在一起?
【问题讨论】:
您是想在 (salary) 上简单地添加一个额外的列,还是寻找更通用的查询以在一行中获取所有属性? @MarkLeiber Salary 只是一个例子。我想在一行中获取所有属性。 除非您可以提供有关表结构的一些详细信息和一些示例数据,否则我们无能为力。这是一个相对简单的结构查询。我建议在 sqlfiddle.com 上创建它。 【参考方案1】:SELECT
Contacts.FirstName,
Contacts.LastName,
Properties.Name,
ContactsExtra.PropertyValue
FROM
Contacts
LEFT OUTER JOIN ContactsExtra ON Contacts.Id = ContactsExtra.ContactId
LEFT OUTER JOIN Properties ON ContactsExtra.PropertyId = Properties.Id
好的,这是带有 PIVOT 的更新(不是我最初认为的 UNPIVOT)...
SELECT
*
FROM
(
SELECT
Contacts.FirstName,
Contacts.LastName,
Properties.Name,
ContactsExtra.PropertyValue
FROM
Contacts
LEFT OUTER JOIN ContactsExtra ON Contacts.Id = ContactsExtra.ContactId
LEFT OUTER JOIN Properties ON ContactsExtra.PropertyId = Properties.Id
) DerivedPivotable
PIVOT
(
MAX(PropertyValue)
FOR [Name] IN (<comma delimited list of values from your Properties.Name field, without string markup>)
--FOR [Name] IN (Salary, Height, Status, SSN) --example row
) Pivoted
请检查您的数据 - 我希望输出类似于...
FirstName LastName Salary Height Status SSN
-----------------------------------------------------------
Jane Doe NULL 5'7" Single NULL
Bob Smith 70,000 6'1" NULL 123-45-6789
MAX 的使用有点麻烦,因为它必须是聚合函数。假设用户和属性的每个组合在 ContactsExtra 表中只有一个值。
【讨论】:
刚刚看到后续评论关于将所有属性放在一行中。我认为这将是一个 UNPIVOT - 当我有东西时会更新...... 那太好了。谢谢!是的。我认为需要Unpivot
。
已按承诺更新。
不要随身携带我的工作笔记本电脑。明天我会尽快检查。谢谢。以上是关于在一个 SELECT 中将主表的数据连接到键/值表数据的主要内容,如果未能解决你的问题,请参考以下文章