pokaż fikcyjny wiersz jako grupę, kierując się na lewe sprzężenie zewnętrzne

Nov 24 2020

Mam 3 tabele z informacją o firmie, dziale i pracowniku. Teraz chcę poznać wszystkich pracowników, którzy pracują w firmie A w dziale D i chcę wyświetlić dane dla złączenia wewnętrznego i lewego, aby zobaczyć każdy dział, który nie ma żadnego pracownika oraz firmę, która nie ma żadnego działu.

Pomiędzy wszystkimi tymi tabelami istnieje relacja klucza nadrzędnego

**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.

Chcę również wyświetlić jednostkę w każdej kolumnie jako kolumnę fikcyjną.

    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           -              -

Odpowiedzi

Popeye Nov 24 2020 at 06:54

Możesz użyć SEToperatora UNION ALLw następujący sposób:

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

Spróbuj tego:

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

Weź pod uwagę, że zgodnie z przykładem modelu tabeli wygląda na to, że zakładki firmy i działu są połączone na podstawie nazwa_firmy. Również tabele działu i pracownika są łączone na podstawie nazwy działu. W ten sposób wdrażany jest wybór. W razie potrzeby - przeróbka łączy z odpowiednimi kolumnami relacyjnymi.