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

Correção do erro “ORA-01789:bloco de consulta tem número incorreto de colunas de resultado”


Se você está recebendo o erro “ORA-01789:bloco de consulta tem número incorreto de colunas de resultado” no banco de dados Oracle, provavelmente é porque você está tentando usar um operador como UNION , INTERSECT , ou EXCEPT para executar uma consulta composta, mas o SELECT instruções em ambos os lados do operador retornam um número diferente de colunas.

Para corrigir isso, basta garantir que ambas as consultas retornem o mesmo número de colunas.

Exemplo de erro


Aqui está um exemplo de código que produz o erro:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;

Resultado:
ORA-01789: query block has incorrect number of result columns

Aqui, estou usando o UNION operador para criar uma consulta composta. Infelizmente estou recebendo um erro, porque incluí apenas uma coluna na primeira consulta, mas duas colunas na segunda.

Solução


A maneira de corrigir esse problema é garantir que ambas as consultas retornem o mesmo número de colunas.

Assim, podemos adicionar uma nova coluna ao primeiro SELECT demonstração:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;

Resultado:
EMPLOYEEID EMPLOYEENAME
1 Bart
1 Mia
2 Janeiro
2 Rohit
3 Ava
3 Pedro
4 Ava
4 Rohit
5 Monito
6 Monito
7 Monito

Ou podemos remover uma das colunas da segunda consulta:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;

Resultado:
EMPLOYEENAME
Ava
Bart
Janeiro
Mia
Monito
Pedro
Rohit

Esteja ciente de que você pode obter resultados muito diferentes, dependendo da opção que você usa. Na verdade, obtivemos resultados diferentes em nosso exemplo acima.

Isso ocorre porque o UNION operador retorna linhas distintas, a menos que seja anexado com o ALL palavra-chave. Quando incluímos as colunas "ID", isso tornou algumas linhas distintas quando não seriam se tivéssemos retornado apenas as colunas "nome". Então, quando excluímos as colunas “ID”, obtemos os valores exclusivos das colunas “nome”.

Se você realmente deseja que valores duplicados sejam retornados, você pode usar o ALL palavra-chave.

Portanto, podemos modificar nosso último exemplo da seguinte forma:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;

Resultado:
EMPLOYEENAME
Bart
Janeiro
Ava
Rohit
Monito
Monito
Monito
Mia
Rohit
Pedro
Ava
Monito
Monito