He notado un comportamiento extraño de FULL OUTER JOIN en Oracle 11. Estaba uniendo tablas del esquema de recursos humanos, particularmente EMPLEADOS y DEPARTAMENTOS.Comportamiento extraño de la combinación externa completa en Oracle: ¿cómo podría explicarse?
Por ejemplo, la siguiente consulta devuelve 123 filas:
SELECT * FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id
Sin embargo, lo que es difícil de entender - cuando pongo un conjunto de columnas particulares en la cláusula select, la consulta devolverá 122 filas (una fila que falta es para un empleado que no tiene asignado departamento - la que, además, se devuelve con izquierda se unen en comparación con combinación interna):
SELECT first_name, last_name, department_name FROM employees e
FULL JOIN departments d on e.department_id = d.department_id
Incluso cuando cuente las filas que devuelve 122 (COUNT(*)
) !!! ¿QUE ESTA PASANDO? ¿Cuál es la diferencia entre SELECT *
y SELECT COUNT(*)
?
El plan para explicar 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
y para 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
¿Qué ocurre si se utiliza el 'union' para aquellas columnas ? ¿obtienes algo diferente cuando usas 'union all'?¿Qué obtendrás si cuentas con 'group by first_name, last_name, department_name'? –
'SELECCIONAR * FROM empleados e departamentos FULL JOIN d en e.department_id = d.department_id' devuelve 123 filas y' SELECT count (*) FROM employees e FULL JOIN departamentos d en e.department_id = d.department_id' devuelve 122 filas? –
Sí, exactamente, es por eso que he publicado esta pregunta. –