2013-11-15 151 views
2

目前我有一个表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四列,用户钥,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内的以下方式存储值。

什么是一个有效的方法来做到这一点。

非常感谢

+0

什么是您的RDBMS?给定一个用户你想找到'cs1','cs2'和'cs3'然后做什么? –

回答

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:

编辑

关于注释的问题 - 你只需要昌e 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; 
+0

嗨Przemyslaw,我有75000用户密钥,并运行75000这个脚本是不可行的选择。有没有办法让我可以通过所有的用户密钥?我存在一种方式,我可以将所有的用户密钥存储在变量中 – navman

+0

@navman这是一次性脚本吗?你有没有试过运行这个查询? –

+0

@navman我刚刚用75000个不同的用户密钥对一张桌子进行了测试,它花费了0.1秒。你试过了吗? –

相关问题