【问题标题】:How to transform a MySQL table into another that has key value pairs?如何将 MySQL 表转换为另一个具有键值对的表?
【发布时间】:2015-10-03 04:02:50
【问题描述】:

我必须在 MySQL 中完成一个要求,我需要将一个常规表转换为另一个具有键值对的表,对此我找不到任何答案(我对 SQL 比较陌生)。

我已经能够找到与我的要求完全相反的方法的答案 - 这是sample

作为我项目中数据库迁移活动的一部分,源表目前看起来像这样:

mysql> SELECT * FROM employee;
+------+-------+--------+
| id   | fname | lname  |
+------+-------+--------+
| 1    | Lex   | Luthor |
| 2    | Clark | Kent   |
| 3    | Lois  | Lane   |
+------+-------+--------+
3 rows in set (0.00 sec)

现在,必须将其转换为如下所示的表格:

+----------------+-----------------+
| attribute_name | attribute_value |
+----------------+-----------------+
| id             | 1               |
| fname          | Lex             |
| lname          | Luthor          |
| id             | 2               |
| fname          | Clarke          |
| lname          | Kent            |
| id             | 3               |
| fname          | Lois            |
| lname          | Lane            |
+----------------+-----------------+

我已经尝试并得到了以下查询,但结果还没有完全出现。

mysql> SELECT
    -> T.COLUMN_NAME AS attribute_name,
    -> CASE T.COLUMN_NAME
    -> WHEN 'id' THEN employee.id
    -> WHEN 'fname' THEN employee.fname
    -> WHEN 'lname' THEN employee.lname
    -> END AS attribute_value
    -> FROM employee, INFORMATION_SCHEMA.COLUMNS T WHERE T.COLUMN_NAME IN
    -> (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'data_migration_test_destination' AND TABLE_NAME = 'employee');                         
+----------------+-----------------+
| attribute_name | attribute_value |
+----------------+-----------------+
| ID             | 1               |
| ID             | 1               |
| id             | 1               |
| fname          | Lex             |
| lname          | Luthor          |
| id             | 1               |
| fname          | Lex             |
| lname          | Luthor          |
| id             | 1               |
| ID             | 2               |
| ID             | 2               |
| id             | 2               |
| fname          | Clark           |
| lname          | Kent            |
| id             | 2               |
| fname          | Clark           |
| lname          | Kent            |
| id             | 2               |
| ID             | 3               |
| ID             | 3               |
| id             | 3               |
| fname          | Lois            |
| lname          | Lane            |
| id             | 3               |
| fname          | Lois            |
| lname          | Lane            |
| id             | 3               |
+----------------+-----------------+
27 rows in set (0.05 sec)

不太清楚为什么会在结果中弹出 ID 之类的内容,以及为什么其他键值对(id、fname 和 lname)有多次重复。理想情况下,预期的行数必须为 9,但我得到 27!

【问题讨论】:

  • 只需按两列分组
  • 尼克,下面的答案有用吗?如果是这样,请考虑通过单击答案左侧的勾号来接受它。谢谢!

标签: mysql sql database-migration


【解决方案1】:

试试这个

                mysql>  CREATE TABLE #Test
                    (
                        [id] INT,
                        fname  NVARCHAR(60),
                        lname NVARCHAR(60)
                    )
                    INSERT INTO #Test VALUES 
                    (1,          'Lex',     'Luthor'),
                    (2,          'Clark',     'Kent'),
                    (3,          'Lois',    'Lane')


                    select * from #Test

                    select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
                           T2.N.value('text()[1]', 'nvarchar(max)') as Value
                    from (select *
                          from #Test
                          for xml path(''), type) as T1(X)
                      cross apply T1.X.nodes('/*') as T2(N)


                    drop table #Test

【讨论】:

  • 你错过了mysql标签
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2022-10-15
  • 1970-01-01
相关资源
最近更新 更多