Zeigen Sie die Dummy-Zeile als Gruppe an, indem Sie auf die linke äußere Verknüpfung zusteuern
Ich habe 3 Tabellen sagen Firma, Abteilung und Mitarbeiter. Jetzt möchte ich alle Mitarbeiter herausfinden, die in Unternehmen A unter Abteilung D arbeiten, und Daten für den inneren und den linken äußeren Join anzeigen, um alle Abteilungen zu sehen, die keinen Mitarbeiter haben, und das Unternehmen, das keine Abteilung hat.
Zwischen all diesen Tabellen besteht eine übergeordnete Schlüsselbeziehung
**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.
Ich möchte auch eine Entität für jede Spalte als Dummy-Spalte anzeigen.
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 - -
Antworten
Sie können den SET
Operator UNION ALL
wie folgt verwenden:
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
Bitte versuchen Sie dies:
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
Berücksichtigen Sie, dass es gemäß Ihrem Tabellenmodellbeispiel so aussieht, als würden Firmen- und Abteilungs-Tabels basierend auf Firmenname verbunden. Auch Abteilungs- und Mitarbeitertabellen werden basierend auf Abteilungsname verknüpft. So wird select implementiert. Bei Bedarf - Nacharbeiten werden mit geeigneten relationalen Spalten verbunden.