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.