왼쪽 외부 조인에 대한 제목으로 더미 행을 그룹으로 표시

Nov 24 2020

회사, 부서 및 직원이라는 3 개의 테이블이 있습니다. 이제 D 부서의 A 회사에서 근무하는 모든 직원을 찾고, 직원이없는 부서와 부서가없는 회사를보기 위해 내부 및 왼쪽 외부 조인에 대한 데이터를 표시하고 싶습니다.

이 모든 테이블간에 상위 키 관계가 있습니다.

**TABLE COMPANY**

  COMPANY_NAME  COMPANY ID
     C1            COMP1
     C2            COMP2
     C3            COMP3

 **TABLE DEPARTMENT**
 DEPARTMENT_NAME    COMPANY_NAME
   D1                C1
   D2                C1
   D3                C2

   **TABLE EMPLOYEE**
  EMPLOYEE_ID   DEPARTMENT_NAME
   E1              D1
   E2              D1
   E3              D1
   E4              D2
   E5              D2

Company -- > Department --- > Employee.

또한 각 열에 대한 엔티티를 더미 열로 표시하고 싶습니다.

    ENTITY     COMPANY_NAME DEPARTMENT_NAME EMPLOYEE_ID
    COMPANY      C1           -              -
    DEPARTMENT   C1           D1               
    EMPLOYEE     C1           D1             E1
    EMPLOYEE     C1           D1             E2
    EMPLOYEE     C1           D1             E3
    DEPARTMENT   C1           D2             -
    EMPLOYEE     C1           D2             E4
    EMPLOYEE     C1           D2             E5 
    COMPANY      C2           -              -
    DEPARTMENT   C2           D3             -
    COMPANY      C3           -              -

답변

Popeye Nov 24 2020 at 06:54

다음과 같이 SET연산자 UNION ALL를 사용할 수 있습니다 .

SELECT 'COMPANY' AS ENTITY, 
        COMPANY_NAME, 
        '-' AS DEPARTMENT_NAME, 
        '-' AS EMPLOYEE_ID 
   FROM COMPANY C
UNION ALL
SELECT 'DEPARTMENT' AS ENTITY, 
        C.COMPANY_NAME, 
        D.DEPARTMENT_NAME, 
        '-' AS EMPLOYEE_ID 
   FROM DEPARTMENT D 
   JOIN COMPANY C ON C.COMPANY_ID = D.COMPANY_ID
UNION ALL
SELECT 'EMPLOYEE' AS ENTITY, 
        C.COMPANY_NAME, 
        D.DEPARTMENT_NAME, 
        E.EMPLOYEE_ID 
  FROM DEPARTMENT D 
  JOIN COMPANY C ON C.COMPANY_ID = D.COMPANY_ID
  JOIN EMPLOYEE E ON E.DEPARTMENT_NAME = D.DEPARTMENT_NAME
ORDER BY COMPANY_NAME, 
         CASE WHEN DEPARTMENT_NAME = '-' THEN 1 ELSE 2 END, 
         DEPARTMENT_NAME,
         CASE WHEN EMPLOYEE_ID = '-' THEN 1 ELSE 2 END, 
         EMPLOYEE_ID
gogocho Nov 24 2020 at 08:53

이것을 시도하십시오 :

select
    case entity_disp
        when 1 then 'COMPANY'
        when 2 then 'DEPARTMENT'
        when 3 then 'EMPLOYEE'
    end as entity,
    company_name,
    department_name,
    employee_id
    from
    
(select
    c.company_name,
    d.department_name,
    e.employee_id,
    1 + decode(d.department_name, null, 0, 1) + decode(e.employee_id, null, 0, 1) as entity_disp
from
    company c
    left outer join department d on (d.company_name = c.company_name)
    left outer join employee  e on (e.department_name = d.department_name)
 ) c   
 order by c.entity_disp

yor tabel model expample에 따르면 Company 및 Department tabel이 company_name을 기준으로 결합 된 것처럼 보인다는 점을 고려하십시오. 또한 Department 및 Employee 테이블은 Department_name을 기준으로 조인됩니다. 이것이 select가 구현되는 방법입니다. 필요한 경우-재 작업은 적절한 관계형 열과 결합합니다.