2017-05-31 120 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