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.