【问题标题】:MSSQL: Joining multiple tables with dynamic valuesMSSQL:使用动态值连接多个表
【发布时间】:2014-08-26 15:55:36
【问题描述】:

我正在努力将以下 3 个表放入一个查询中:

ID          FirstName
1           'Jack'
2           'Liz'

t属性

ID          AttributeName
101         'LastName'
102         'Gender'

tData

PersonID    AttributeID     AttributeValue
1           101             'Nicholson'
1           102             'Male'
2           101             'Taylor'
2           102             'Female'

重要提示tAttribute 中的属性是动态的。可能还有更多,例如:

ID          AttributeName
103         'Income'
104         'MostPopularMovie'

问题:如何编写我的查询(或必要时的查询),以便获得以下输出:

PersonID    FirstName   LastName        Gender      [otherFields]
1           'Jack'      'Nicholson'     'Male'      [otherValues]
2           'Liz'       'Taylor'        'Female'    [otherValues]

我经常阅读“到目前为止您尝试过什么?”,但是使用子查询和联接发布我所有失败的尝试并没有多大意义。我只是对 SQL 不太安全。

非常感谢。

【问题讨论】:

  • @Tab Alleman 这看起来很有希望,谢谢!会试一试:)
  • 理性数据库中的 EAV 本身就是一个设计缺陷。只有在非常罕见的情况下无法提前确定字段时才会显示。在这种罕见的情况下,实际数据库是错误的工具。如果您真的需要 EAV 表,请使用 nosql 数据库。否则,进行适当的关系设计,它会更快更容易查询。
  • 感谢@HLGEM。对于谷歌同事:stackoverflow.com/questions/870808/…(不幸的是,在我的情况下,它是第 3 方工具的一部分)

标签: sql-server join pivot entity-attribute-value


【解决方案1】:

感谢@Tab Alleman,我在谷歌上搜索“SQL PIVOT”并得出以下结果:

SELECT      PersonID,
            FirstName,
            [LastName],
            [Gender]
FROM (
    SELECT      tPerson.ID AS PersonID,
                tPerson.FirstName,
                tAttribute.AttributeName,
                tData.AttributeValue
    FROM        tAttribute
    INNER JOIN  tData ON (
                    tAttribute.ID = tData.AttributeID
                )
    INNER JOIN  tPerson ON (
                    tData.PersonID = tPerson.ID
                )
) AS unPivotResult
PIVOT (
    MAX(AttributeValue)
    FOR AttributeName IN ([LastName],[Gender])
) AS pivotResult

补充:我不知道如何通过 SQL 动态获取 LastNameGender,所以我使用了用于编程的 ColdFusion。它看起来像这样:

<!--- "local.attributes" gets generated by making another query,--->
<!--- I just wrote it statically here for this example --->
<cfset local.attributes = "[LastName],[Gender]" />

<cfquery name="local.persons">
    SELECT      PersonID,
                FirstName,
                #local.attributes#
    FROM (
        ... 
    ) AS unPivotResult
    PIVOT (
        MAX(AttributeValue)
        FOR AttributeName IN (#local.attributes#)
    ) AS pivotResult
</cfquery>

如果我可以用类似的东西替换 ColdFusion 部分,那就太好了 SELECT AttributeName FROM tAttribute 然后使用它来获取括号定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2023-04-10
    相关资源
    最近更新 更多