Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Explicação do Operador Oracle INTERSECT


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.