sql >> Base de Datos >  >> RDS >> Oracle

Explicación del operador Oracle INTERSECT

En Oracle Database, el INTERSECT El operador se utiliza para crear una consulta compuesta que devuelve la intersección de los resultados de la izquierda y la derecha SELECT declaraciones. En otras palabras, combina dos consultas, pero devuelve solo las filas que se devuelven en ambas consultas.

Ejemplo

Supongamos que tenemos las siguientes tablas:

SELECT * FROM Employees;
SELECT * FROM Customers;

Resultado:

ID DE EMPLEADO NOMBRE DEL EMPLEADO
1 Bart
2 enero
3 Ava
4 Rohit
5 Monish
6 Monish
7 Monish
ID DE CLIENTE NOMBRE DEL CLIENTE
1 Mía
2 Rohit
3 Pedro
4 Ava
5 Monish
6 Monish

Podemos usar el INTERSECT operador para devolver empleados que también son clientes:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultado:

NOMBRE DEL EMPLEADO
Ava
Monish
Rohit

Por lo tanto, devuelve solo los valores que aparecen tanto en Employees tabla y los Customers mesa.

Implementación de Oracle Database de INTERSECT El operador solo devuelve filas distintas. Esto lo podemos ver en el ejemplo anterior. Devuelve solo una fila para Monish, aunque hay varios empleados y varios clientes con ese nombre.

Algunos RDBMS nos permiten incluir duplicados en el resultado al aceptar un ALL opcional palabra clave con INTERSECT operador, pero Oracle no es uno de ellos (al menos, no en el momento de escribir este artículo). SQLite tampoco.

Una consulta alternativa

Es posible obtener el mismo resultado sin utilizar INTERSECT operador. Por ejemplo, podríamos reescribir nuestro primer ejemplo así:

SELECT 
    DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Resultado:

NOMBRE DEL EMPLEADO
Rohit
Ava
Monish

Algunas cosas para recordar

Tenga en cuenta que las expresiones deben coincidir en número y deben estar en el mismo grupo de tipos de datos. Por lo tanto, no podemos hacer lo siguiente:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers;

Resultado:

ORA-01789: query block has incorrect number of result columns

O esto:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers;

Resultado:

ORA-01790: expression must have same datatype as corresponding expression

Aunque, podemos usar funciones como TO_CHAR() para convertir una columna en un grupo de tipo de datos adecuado:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers;

Resultado:

no data found

En este caso, no se encontraron datos porque ninguno de los CustomerId los valores coincidieron con cualquiera de los EmployeeName valores. Pero si lo hicieran, veríamos los partidos.