2013-06-04 30 views
0

中查询,如果我有4个表是这样的:如何分支多个表

1- mainemployees 

emp_id 
email 
type (0-->ext,1-->internal,2--->special) 

2-externalemp 

emp_id 
name 

3-internalemp 

emp_id 
name 

4-specialemp 

emp_id 
name 

现在我希望所有的employee names ,其中第一表的emp_id =最后三张表 之一的emp_id如何做到这一点(性能明智)。

回答

1
select nvl(ee.name, nvl(ie.name, se.name)) 
from mainemployees me 
left join 
     externalemp ee 
on  ee.emp_id = me.emp_id 
left join 
     internalemp ie 
on  ie.emp_id = me.emp_id 
left join 
     specialem se 
on  se.emp_id = me.emp_id 
where nvl(ee.name, '') <> '' 
     or nvl(ie.name, '') <> '' 
     or nvl(se.name, '') <> '' 
+0

是什么在'informix'的替代'coalesce'因为我得到的语法错误,当我尝试这种方法。 –

+1

Informix似乎使用'nvl'作为'coalesce'替代 – Andomar

+0

,但是当我使用'NVL'时,它需要两个参数而不是三个参数 –

1
create table mainemployees (emp_id int, emp_type int) 

create table externalemp (emp_id int, name nvarchar(20)) 

create table internalemp (emp_id int, name nvarchar(20)) 

create table specialemp (emp_id int, name nvarchar(20)) 

insert into mainemployees (emp_id, emp_type) values (1, 0), (2, 1), (3, 2) 

insert into externalemp (emp_id, name) values (1, 'external') 
insert into internalemp (emp_id, name) values (2, 'internal') 
insert into specialemp (emp_id, name) values (3, 'special') 

而对于查询使用CASE选择右列

SELECT 
    CASE me.emp_type WHEN 0 THEN ee.name WHEN 1 THEN ie.name WHEN 2 THEN se.name END 
FROM mainemployees as me 
LEFT JOIN externalemp as ee ON me.emp_id = ee.emp_id 
LEFT JOIN internalemp as ie ON me.emp_id = ie.emp_id 
LEFT JOIN specialemp as se ON me.emp_id = se.emp_id