将 master table 的数据加入到一个 key/value table 数据中 SELECT
Join master table's data to a key/value table data in one SELECT
我有一个名为 Contacts
的 table,其中包含列
- 编号
- 名字
- 姓氏
我还有一个 table 叫 ContactsExtra
。它有以下列:
- 编号
- ContactId(FK 指联系人 ID)
- PropertyId(FK 指属性 Id)
- 属性值
这是一个 Key/Value table,用于存储一些额外的联系人属性。例如。如果联系人有 Salary 属性 在此 table 中有一条记录用于所有 Contacts 存储 工资值。
所有属性(无论是否在主 Contacts
table 中)都存储在名为 Properties
的单独 table 中。在此 table 中,那些来自 Contacts
的属性(FirstName 和 LastName)被锁定。但用户可以添加或删除自定义属性(这些属性未锁定)。这些新属性的值将存储在 ContactsExtra
.
中
Properties
table 包含以下列:
- 编号
- 姓名
我想做的是用一个SELECT显示所有联系信息。所以例如在上述情况下,结果将包含列 Id、FirstName、LastName 以及 工资。前三个来自联系人,最后一个来自 Key/Value table。如何将这些信息连接在一起?
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 table 中只有一个值。
我有一个名为 Contacts
的 table,其中包含列
- 编号
- 名字
- 姓氏
我还有一个 table 叫 ContactsExtra
。它有以下列:
- 编号
- ContactId(FK 指联系人 ID)
- PropertyId(FK 指属性 Id)
- 属性值
这是一个 Key/Value table,用于存储一些额外的联系人属性。例如。如果联系人有 Salary 属性 在此 table 中有一条记录用于所有 Contacts 存储 工资值。
所有属性(无论是否在主 Contacts
table 中)都存储在名为 Properties
的单独 table 中。在此 table 中,那些来自 Contacts
的属性(FirstName 和 LastName)被锁定。但用户可以添加或删除自定义属性(这些属性未锁定)。这些新属性的值将存储在 ContactsExtra
.
Properties
table 包含以下列:
- 编号
- 姓名
我想做的是用一个SELECT显示所有联系信息。所以例如在上述情况下,结果将包含列 Id、FirstName、LastName 以及 工资。前三个来自联系人,最后一个来自 Key/Value table。如何将这些信息连接在一起?
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 table 中只有一个值。