【发布时间】: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