连接表和返回单行不同列中的数据以及连接数

时间:2018-04-24 09:37:15

标签: sql oracle oracle11g

我们在Oracle 11g中有3个表,需要离开加入它们并返回单行不同列中的数据和连接数,是否有任何方法可以实现相同的效果。

实施例

表1:(Employee_Data)

enter image description here

表2:(Employee_Address)

enter image description here

表3:(Employee_Role)

enter image description here

预期结果:

enter image description here

Mack有2个地址和2个角色,因此Emp_Addr_Count为2,Emp_Role_Count为2且相关数据位于同一行的不同列中。

请注意,EMP_ID在Employee_Data表中是唯一的,Employee_Address和Employee_Role对于员工可以是多个或零。

先谢谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT E.Emp_Id
    ,E.Emp_Name
    ,E.Emp_Age
    ,NVL(MAX(EA.RN),0)Addr_Count
    ,NVL(MAX(CASE WHEN EA.RN = 1 THEN EA.Emp_Address END),' ')Emp_Address_1
    ,NVL(MAX(CASE WHEN EA.RN = 1 THEN EA.Emp_City END),' ')Emp_City_1
    ,NVL(MAX(CASE WHEN EA.RN = 2 THEN EA.Emp_Address END),' ')Emp_Address_2
    ,NVL(MAX(CASE WHEN EA.RN = 2 THEN EA.Emp_City END),' ')Emp_City_2
    ,NVL(MAX(ER.RN1),0)Role_Count
    ,NVL(MAX(CASE WHEN ER.RN1 = 1 THEN ER.Emp_task END),' ')Emp_task_1
    ,NVL(MAX(CASE WHEN ER.RN1 = 2 THEN ER.Emp_task END),' ')Emp_task_2 FROM Employee_Data E JOIN(
SELECT Emp_Id
    ,ROW_NUMBER() OVER(PARTITION BY Emp_Id ORDER BY Emp_City desc) RN
    ,Emp_City
    ,Emp_Address
FROM Employee_Address
)EA ON EA.Emp_Id = E.Emp_Id left JOIN(
SELECT Emp_Id
    ,ROW_NUMBER() OVER(PARTITION BY Emp_Id ORDER BY Emp_Task) RN1
    ,Emp_task
FROM Employee_Role
)ER ON ER.Emp_Id = E.Emp_Id GROUP BY E.Emp_Id,E.Emp_Name,E.Emp_Age

<强>输出:

EMP_ID  EMP_NAME    EMP_AGE ADDR_COUNT  EMP_ADDRESS_1   EMP_CITY_1  EMP_ADDRESS_2   EMP_CITY_2  ROLE_COUNT  EMP_TASK_1  EMP_TASK_2
1       MACK        45      2       HOME PARADISE       MUM         TINDER ONCLAVE  DEL         2           Manage Task Resource Manage
2       JACK        30      1       BLUE PLAZA          MUM                                     1           Code    
3       ANGEL       27      1       HOME PARADISE       MUM                                     0       

答案 1 :(得分:1)

您可以按以下声明加入:

WITH t AS
(
 SELECT d.*, a.emp_address, a.emp_city, r.emp_task  
   FROM employee_data d 
   JOIN employee_address a on ( d.emp_id = a.emp_id )
   FULL OUTER JOIN employee_role r on ( d.emp_id = r.emp_id )
)
SELECT emp_id, emp_name, emp_age, count(distinct emp_address) emp_addr_count, 
       min(emp_address) emp_address_1, max(emp_city) emp_city_1, 
       decode(min(emp_address),max(emp_address),null,max(emp_address)) emp_address_2, 
       decode(min(emp_city),max(emp_city),null,min(emp_city)) emp_city_2,
       count(distinct emp_task) emp_role_count, min(emp_task) emp_task_1, 
       decode(min(emp_task),max(emp_task),null,max(emp_task)) emp_task_2        
  FROM t
 GROUP BY emp_id, emp_name, emp_age     
 ORDER BY emp_id;

https://jsfiddle.net/yqqxokme/