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 |