2

我有一个名为 ContactAttrbiutes 的表,其中包含每个联系人属性的列表。为这些联系人存储的数据类型包括:头衔、名字、姓氏电话号码等。

当前表

+-------------+-----------+------------------------------+
| attributeId | ContactId | AttributeValue               |
+-------------+-----------+------------------------------+
|           1 |         5 | Lady                         |
|           2 |         5 | Elizabeth                    |
|           3 |         5 | E                            |
|           4 |         5 | Anson                        |
|           5 |         5 |                              |
|           6 |         5 |                              |
|           7 |         5 |                              |
|           8 |         5 |                              |
|          10 |         5 | 0207 72776                   |
|          11 |         5 |                              |
|          12 |         5 | 0207 22996                   |
|          13 |         5 | 0207 72761                   |
|          14 |         5 |                              |
|          15 |         5 |                              |
|          60 |         5 | Lloyds                       |
|          61 |         5 |                              |
|           1 |        10 | Mr                           |
|           2 |        10 | John                         |
|           3 |        10 | J C                          |
|           4 |        10 | Beveridge                    |
|           5 |        10 | Esq QC                       |
|           6 |        10 | Retired                      |
|           7 |        10 |                              |
|           8 |        10 |                              |
|          10 |        10 | 0207 930                     |
|          11 |        10 |                              |
|          12 |        10 |                              |
|          13 |        10 | 0207 930                     |
|          14 |        10 |                              |
|          15 |        10 |                              |
|          60 |        10 |                              |
|          61 |        10 |                              |
+-------------+-----------+------------------------------+

但是我想运行一个查询来创建一个看起来像......

新表

+-----------+----------------------+-------------------------+-----------------------+------------------------+
| ContactId | AttributeValue_Title | AttributeValue_ForeName |AttributeValue_Initial | AttributeValue_Surname |
+-----------+----------------------+-------------------------+-----------------------+------------------------+
| 5         | Lady                 | Elizabeth               | E                     |  Anson                 |
+-----------+----------------------+-------------------------+-----------------------+------------------------+
| 10        | Mr                   | John                    | J C                   | Beveridge              |
+-----------+----------------------+-------------------------+-----------------------+------------------------+

我确信有一个非常简单的答案,但我花了几个小时寻找。任何人都可以帮忙吗?

以上只是我表的一小部分,我有 750,000 个联系人。此外,我希望最终表的列比我上面描述的要多,但它们将来自现有表的不同属性。

非常感谢您提前。

4

2 回答 2

5

尝试这个

    SELECT ContactId , 
 max(CASE when attributeId = 1 then AttributeValue end) as AttributeValue_Title ,
 max(CASE when attributeId = 2 then AttributeValue end )as AttributeValue_ForeName ,
 max(CASE when attributeId = 3 then AttributeValue end )as AttributeValue_Initial ,
 max(CASE when attributeId = 4 then AttributeValue end) as AttributeValue_Surname  
 from Table1 
 group by ContactId

在这里演示

  • 如果你想让你的结果更长,attributeId那么只需在代码中添加一个 case 语句。
于 2013-08-01T16:24:50.477 回答
1
SELECT
    t_title.AttributeValue AS title,
    t_name.AttributeValue AS name,
    ...
FROM the_table AS t_title
JOIN the_table AS t_firstname USING(contact_id)
JOIN ...
WHERE
    t_title.attributeId = 1 AND
    t_firstname.attributeId = 2 AND
    ...

在大多数情况下,EAV“模型”是一种反模式。你真的会有可变数量的属性吗?如果是,那么 no-SQL 解决方案可能比关系数据库更合适。

于 2013-08-01T16:22:57.337 回答