Ho notato uno strano comportamento di FULL OUTER JOIN in Oracle 11. Stavo unendo le tabelle dello schema delle risorse umane, in particolare i DIPENDENTI e i DEPARTMENT.Strano comportamento del join esterno completo in Oracle: come potrebbe essere spiegato?
Ad esempio, la seguente query restituisce 123 righe:
SELECT * FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id
Tuttavia, ciò che è difficile da capire - quando ho messo una serie di particolari colonne nella clausola di selezione, la query restituirà 122 righe (un fila manca è per un lavoratore dipendente che non ha assegnato reparto - quello che è inoltre restituito con sinistra unirsi in confronto ad unirsi interno):
SELECT first_name, last_name, department_name FROM employees e
FULL JOIN departments d on e.department_id = d.department_id
Anche quando io conto le righe restituisce 122 (COUNT(*)
) !!! COSA STA SUCCEDENDO? Qual è la differenza tra SELECT *
e SELECT COUNT(*)
?
Il piano per spiegare SELECT * ...
:
SELECT STATEMENT 122
VIEW VW_FOJ_0 122
HASH JOIN FULL OUTER 122
Access Predicates
E.DEPARTMENT_ID = D.DEPARTMENT_ID
TABLE ACCESS DEPARTMENTS FULL 27
TABLE ACCESS EMPLOYEES FULL 107
e per SELECT COUNT(*) ...
:
SELECT STATEMENT 1
SORT AGGREGATE 1
VIEW VW_FOJ_0 122
HASH JOIN FULL OUTER 122
Access Predicates
E.DEPARTMENT_ID = D.DEPARTMENT_ID
INDEX DEPT_ID_PK FAST FULL SCAN 27
INDEX EMP_DEPARTMENT_IX FAST FULL SCAN 107
Cosa succede se si utilizza il 'union' per quelle colonne ? ottieni qualcosa di diverso quando usi 'union all'?cosa succede se contate con 'group by first_name, last_name, department_name'? –
'SELECT * FROM dipendenti e FULL JOIN reparti d su e.department_id = d.department_id' restituisce 123 righe e' SELECT count (*) FROM impiegati e FULL JOIN reparti d su e.department_id = d.department_id' restituisce 122 righe? –
Sì, esattamente - ecco perché ho postato questa domanda. –