在一个 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 显示所有联系信息。所以例如在上述情况下,会有一个包含 IdFirstNameLastName 列以及 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 中将主表的数据连接到键/值表数据的主要内容,如果未能解决你的问题,请参考以下文章

在单个查询中将一个表的多个列连接到另一个表的单个列

如何在火花数据框中将列连接到一个

MySql主从表的主表删除数据

在 Postgres 上加入许多表的解决方案

在oracle sql中将字符串行连接到最大长度

sql 两张表的联系是主表一个字段是由子表id加号拼接而成,请问怎么连