Postgresql
如何優化提取到交叉表中
我有一個像這樣的模式:
[ad_id] . [name] . [valueofname] 1 . name . "brian" 1 . age . "23" 2 . job . "IT" 2 . name . "Jack"
行名包含多個值:年齡、姓名、生日、工作,我想將其轉換為:
[ad_id] . [name] . [age] . [birthday] . [job] [valueofad_id][valueofname] [valueofnameofage] [valueofnameofbirth] [valueofnameofjob]
這是我提出的查詢;它正在工作,但速度很慢,因為它試圖為每一列創建自己的表並加入它。
請問您有什麼建議或見解嗎?我正在處理大量數據並嘗試優化獲取。
select users.ad_id,name.valueofname as name, age.valueofname as age, birthday.valueofname as birthday, job.valueofname as job from users left join users_details as name on (users.ad_id=name.ad_id) left join users_details as age on (users.ad_id=age.ad_id) left join users_details as job on (users.ad_id=job.ad_id) left join users_details as birthday on (users.ad_id=birthday.ad_id) group by ad_id,name.valueofname,age.valueofname,birthday.valueofname;
SELECT * FROM crosstab( 'SELECT ad_id, d.name, d.valueofname FROM users LEFT JOIN users_details d USING (ad_id) ORDER BY 1' , $$VALUES ('name'), ('age'), ('birthday'), ('job')$$ ) AS ct (ad_id int, name text, age text, birthday text, job text);
使
LEFT JOIN
使用者在結果中沒有任何數據。如果這種情況永遠不會發生或不可取,請users
從查詢中完全刪除該表 - 它在這裡沒有其他用途。詳細解釋
crosstab()
:與替代解決方案相比的主要優勢是頂級性能,這似乎是您的主要目標。