2013-11-15 153 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秒。你試過了嗎? –

相關問題