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.