Я заметил странное поведение FULL OUTER JOIN в Oracle 11. Я соединял таблицы из схемы HR, в частности, СОТРУДНИКИ и ОТДЕЛЕНИЯ.
Например, следующий запрос возвращает 123 строки:
SELECT * FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id
Однако, что сложно понять - когда я помещаю набор определенных столбцов в предложение select, запрос возвращает 122 строки (пропущенная строка предназначена для сотрудника, которому не назначен отдел - тот, который дополнительно возвращается с левым соединением по сравнению с внутренним соединением):
SELECT first_name, last_name, department_name FROM employees e
FULL JOIN departments d on e.department_id = d.department_id
Даже когда я считаю строки, он возвращает 122 (COUNT(*)
) !!! ЧТО ЗДЕСЬ ПРОИСХОДИТ? В чем разница между SELECT *
и SELECT COUNT(*)
?
План объяснения для 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
и для 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