2017-05-31 75 views
-3

導致我需要從2個表行值是第二表中的列名,需要從第二表

表1

app_id cat_id approver level proj_id 

    1   1 pm_id   1  731 
    1   2 dm_id   2  843 
    1   3 dm_id   1  859 
    2   4 bo_id   1  859 

表2

proj_id pm_id dm_id bo_id 

    731  100102 100034 100121 
    843  123121 145721 104321 
    859  112312 132434 132435 

我的批准者創建視圖id在表2中,表1表示根據級別誰是項目批准人。我想爲pm,dm和bo的審批列表創建一個視圖。

例如結果表

app_id cat_id approver 

1   1  100102 
1   2  145721 
1   3  132434 
2   4  132435 
+0

內連接http://www.mysqltutorial.org/mysql-inner-join.aspx –

+0

'選擇table1.app_id,table1.cat_id,table2.pm_id作爲table1內部連接table2的批准者,在table1.proj_id = table2.proj_id'現在嘗試通過自己學習更多,在線閱讀一些tutorail做一些研究。 –

+0

這裏是一些堆棧溢出文檔https://stackoverflow.com/documentation/mysql/2736/joins#t=201705310934419709604 –

回答

0

使用left join連接兩個表連接在一起,然後用case when獲得批准。

select 
    table1.app_id, 
    table1.cat_id, 
    case when table1.approver = 'pm_id' then table2.pm_id 
     when table1.approver = 'dm_id' then table2.dm_id 
     when table1.approver = 'bo_id' then table2.bo_id 
    end as approver 
from table1 
left join table2 on table1.proj_id = table2.proj_id 

參見在rextester。

編輯

如果具有動態的審批,試試這個:

SET @sql = NULL; 
SELECT 
    CONCAT('CASE', GROUP_CONCAT(DISTINCT 
     CONCAT(' WHEN table1.approver = ''', 
     approver, 
     ''' THEN table2.', approver) SEPARATOR ' '), ' END AS approver' 
) INTO @sql 
FROM table1; 


SET @sql = CONCAT('SELECT table1.app_id, table1.cat_id, ', @sql, ' FROM table1 LEFT JOIN table2 ON table1.proj_id = table2.proj_id'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

也有Rextester一個demo

創建VIEW

create view view1 
as 
select 
    table1.app_id, 
    table1.cat_id, 
    case when table1.approver = 'pm_id' then table2.pm_id 
     when table1.approver = 'dm_id' then table2.dm_id 
     when table1.approver = 'bo_id' then table2.bo_id 
    end as approver 
from table1 
left join table2 on table1.proj_id = table2.proj_id 
+0

如果表1中有10個不同的批准者,我應該寫10個不同的案例? – user2483712

+0

在我看來,是的。但是,如果您確實擁有超過10個不同的審批者,那麼在'table2'中應該有相應的列,這是您的表的設計嗎?如果是的話,動態SQL將解決太多不同的情況。 @ user2483712 – Blank

+0

是的。你是正確的,現在至少有6級im_id,pm_id,dm_id,bo_id,hr_id和am_id。他們可以增加這些。我需要表2中的列值,其中列名值來自表1.請檢查結果表 – user2483712