从表列获取值并插入另一个表

时间:2013-11-15 10:02:14

标签: sql

目前我有一个表 extended_values ,它以下列方式为用户存储3个自定义值。

+------+-------+---------+
| Name | Value | UserKey |
+------+-------+---------+
| cs1  | tgb   |     100 |
| cs2  | hhy   |     100 |
| cs3  | ttr   |     100 |
| cs1  | hht   |     104 |
| cs2  | iyu   |     104 |
| cs3  | uyt   |     104 |
| cs1  | tjg   |     106 |
| cs2  | yyt   |     106 |
| cs3  | try   |     106 |
+------+-------+---------+

我有另一个表 user_custom_property ,有四列,userkey,cs1,cs2和cs3,我需要按以下格式存储值

+---------+-----+-----+-----+
| userkey | cs1 | cs2 | cs3 |
+---------+-----+-----+-----+
|     100 | tgb | hhy | ttr |
|     104 | hht | iyu | uyt |
|     106 | tjg | yyt | try |
+---------+-----+-----+-----+

有近75000个用户拥有3个自定义值,因此应优化查询,以免在内存方面消耗更多资源。

所以从技术上讲,我需要查询extended_values表,获取对应于用户密钥的cs1,cs2和cs3的值,并按以下方式将值存储在user_custom_property中。

这样做的有效方法是什么。

非常感谢

1 个答案:

答案 0 :(得分:2)

使用GROUP BYCASE可以解决问题:

CREATE TABLE extended_values (
  name VARCHAR(20),
  value VARCHAR(20),
  userkey INT
);

INSERT INTO extended_values VALUES ('cs1', 'tgb', 100);
INSERT INTO extended_values VALUES ('cs2', 'hhy', 100);
INSERT INTO extended_values VALUES ('cs3', 'ttr', 100);
INSERT INTO extended_values VALUES ('cs1', 'hht', 104);
INSERT INTO extended_values VALUES ('cs2', 'iyu', 104);
INSERT INTO extended_values VALUES ('cs3', 'uyt', 104);
INSERT INTO extended_values VALUES ('cs1', 'tjg', 106);
INSERT INTO extended_values VALUES ('cs2', 'yyt', 106);
INSERT INTO extended_values VALUES ('cs3', 'try', 106);

COMMIT;

CREATE TABLE user_custom_property (
  userkey INT,
  cs1 VARCHAR(20),
  cs2 VARCHAR(20),
  cs3 VARCHAR(20)
);

INSERT INTO user_custom_property
  SELECT
      userkey,
      MIN(CASE WHEN name = 'cs1' THEN value END),
      MIN(CASE WHEN name = 'cs2' THEN value END),
      MIN(CASE WHEN name = 'cs3' THEN value END)
    FROM extended_values
  GROUP BY userkey;

SELECT * FROM user_custom_property;

输出:

   USERKEY CS1                  CS2                  CS3                
---------- -------------------- -------------------- --------------------
       100 tgb                  hhy                  ttr                  
       104 hht                  iyu                  uyt                  
       106 tjg                  yyt                  try 

检查SQLFiddle:

修改

关于评论中的问题 - 您只需更改CASE中的值:

INSERT INTO user_custom_property
  SELECT
      userkey,
      MIN(CASE WHEN name = 'ea1' THEN value END),
      MIN(CASE WHEN name = 'ea2' THEN value END),
      MIN(CASE WHEN name = 'ea3' THEN value END)
    FROM extended_values
  GROUP BY userkey;