Zauważyłem dziwne zachowanie PEŁNEGO ZEWNĘTRZNEGO DOŁĄCZU w Oracle 11. Dołączyłem do tabel ze schematu HR, szczególnie PRACOWNICY i DEPARTAMENTY.Dziwne zachowanie pełnego połączenia zewnętrznego w Oracle - jak można to wyjaśnić?
Na przykład poniższa kwerenda zwraca 123 rzędów:
SELECT * FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id
Jednak to, co jest trudne do zrozumienia - gdy kładę zbiór poszczególnych kolumn w klauzuli SELECT, kwerenda zwróci 122 wiersze (a brakuje wiersz jest dla pracownika, który nie ma przypisanego dział - ten, który jest dodatkowo wrócił z lewej przyłączyć w porównaniu do sprzężenia wewnętrznego):
SELECT first_name, last_name, department_name FROM employees e
FULL JOIN departments d on e.department_id = d.department_id
Nawet kiedy liczyć wierszy zwraca 122 (COUNT(*)
) !!! CO SIĘ DZIEJE? Jaka jest różnica między SELECT *
i SELECT COUNT(*)
?
wyjaśniania plan 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
i dla 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
Co się dzieje, jeśli użyć 'unia dla tych kolumn ? czy otrzymasz coś innego, gdy używasz 'union all'?co otrzymasz, jeśli policzysz z 'group by first_name, last_name, department_name'? –
'WYBIERZ * OD pracowników e Dział PEŁNA JOIN d na e.department_id = d.department_id' zwraca 123 wiersze i' SELECT count (*) OD pracowników e FULL JOIN departamentów d na e.department_id = d.department_id' zwraca 122 wiersze? –
Tak, dokładnie - dlatego opublikowałem to pytanie. –