No banco de dados Oracle, o
INTERSECT O operador é usado para criar uma consulta composta que retorna a interseção dos resultados da esquerda e da direita SELECT declarações. Em outras palavras, ele combina duas consultas, mas retorna apenas as linhas que são retornadas em ambas as consultas. Exemplo
Suponha que temos as seguintes tabelas:
SELECT * FROM Employees;
SELECT * FROM Customers; Resultado:
| EMPLOYEEID | EMPLOYEENAME |
|---|---|
| 1 | Bart |
| 2 | Janeiro |
| 3 | Ava |
| 4 | Rohit |
| 5 | Monito |
| 6 | Monito |
| 7 | Monito |
| CUSTOMERID | NOME DO CLIENTE |
|---|---|
| 1 | Mia |
| 2 | Rohit |
| 3 | Pedro |
| 4 | Ava |
| 5 | Monito |
| 6 | Monito |
Podemos usar o
INTERSECT operador para devolver funcionários que também são clientes:SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers; Resultado:
| EMPLOYEENAME |
|---|
| Ava |
| Monito |
| Rohit |
Portanto, ele retorna apenas os valores que aparecem em
Employees tabela e os Customers tabela. Implementação do Oracle Database do
INTERSECT operador retorna apenas linhas distintas. Podemos ver isso no exemplo acima. Ele retorna apenas uma linha para Monish, embora haja vários funcionários e vários clientes com esse nome. Alguns RDBMSs nos permitem incluir duplicatas no resultado aceitando um opcional
ALL palavra-chave com o INTERSECT operador, mas Oracle não é um deles (pelo menos, não no momento da escrita). Nem é SQLite. Uma consulta alternativa
É possível obter o mesmo resultado sem usar o
INTERSECT operador. Por exemplo, poderíamos reescrever nosso primeiro exemplo para isso:SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName); Resultado:
| EMPLOYEENAME |
|---|
| Rohit |
| Ava |
| Monito |
Algumas coisas para lembrar
Observe que as expressões devem corresponder em número e devem estar no mesmo grupo de tipos de dados. Portanto, não podemos fazer o seguinte:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId, CustomerName FROM Customers; Resultado:
ORA-01789: query block has incorrect number of result columns
Ou isto:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerId FROM Customers; Resultado:
ORA-01790: expression must have same datatype as corresponding expression
Embora possamos usar funções como
TO_CHAR() para converter uma coluna em um grupo de tipos de dados adequado:SELECT EmployeeName FROM Employees
INTERSECT
SELECT TO_CHAR(CustomerId) FROM Customers; Resultado:
no data found
Nesse caso, nenhum dado foi encontrado porque nenhum dos
CustomerId os valores correspondiam a qualquer um dos EmployeeName valores. Mas se o fizessem, então veríamos as partidas.