将 master table 的数据加入到一个 key/value table 数据中 SELECT

Join master table's data to a key/value table data in one SELECT

我有一个名为 Contacts 的 table,其中包含列

  1. 编号
  2. 名字
  3. 姓氏

我还有一个 table 叫 ContactsExtra。它有以下列:

  1. 编号
  2. ContactId(FK 指联系人 ID)
  3. PropertyId(FK 指属性 Id)
  4. 属性值

这是一个 Key/Value table,用于存储一些额外的联系人属性。例如。如果联系人有 Salary 属性 在此 table 中有一条记录用于所有 Contacts 存储 工资值。

所有属性(无论是否在主 Contacts table 中)都存储在名为 Properties 的单独 table 中。在此 table 中,那些来自 Contacts 的属性(FirstName 和 LastName)被锁定。但用户可以添加或删除自定义属性(这些属性未锁定)。这些新属性的值将存储在 ContactsExtra.

Properties table 包含以下列:

  1. 编号
  2. 姓名

我想做的是用一个SELECT显示所有联系信息。所以例如在上述情况下,结果将包含列 IdFirstNameLastName 以及 工资。前三个来自联系人,最后一个来自 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 中只有一个值。