Si recibe el error "ORA-01789:el bloque de consulta tiene un número incorrecto de columnas de resultados" en Oracle Database, probablemente se deba a que está tratando de usar un operador como UNION
, INTERSECT
, o EXCEPT
para ejecutar una consulta compuesta, pero el SELECT
las declaraciones a ambos lados del operador devuelven un número diferente de columnas.
Para solucionar esto, simplemente asegúrese de que ambas consultas devuelvan el mismo número de columnas.
Ejemplo de error
Aquí hay un ejemplo de código que produce el error:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Resultado:
ORA-01789: query block has incorrect number of result columns
Aquí, estoy usando UNION
operador para crear una consulta compuesta. Desafortunadamente, recibo un error porque solo incluí una columna en la primera consulta, pero dos columnas en la segunda.
Solución
La forma de solucionar este problema es asegurarse de que ambas consultas devuelvan el mismo número de columnas.
Entonces podemos agregar una nueva columna al primer SELECT
declaración:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Resultado:
ID DE EMPLEADO | NOMBRE DEL EMPLEADO |
---|---|
1 | Bart |
1 | Mía |
2 | enero |
2 | Rohit |
3 | Ava |
3 | Pedro |
4 | Ava |
4 | Rohit |
5 | Monish |
6 | Monish |
7 | Monish |
O podríamos eliminar una de las columnas de la segunda consulta:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Resultado:
NOMBRE DEL EMPLEADO |
---|
Ava |
Bart |
ene |
Mía |
Monish |
Pedro |
Rohit |
Tenga en cuenta que puede obtener resultados muy diferentes según la opción que utilice. De hecho, obtuvimos resultados diferentes en nuestro ejemplo anterior.
Esto se debe a que UNION
El operador devuelve filas distintas a menos que se agregue con ALL
palabra clave. Cuando incluimos las columnas "ID", esto hizo que algunas filas fueran distintas cuando no lo hubieran sido si solo hubiéramos devuelto las columnas "nombre". Luego, cuando excluimos las columnas "ID", obtuvimos los valores únicos de las columnas "nombre".
Si realmente desea que se devuelvan valores duplicados, puede usar ALL
palabra clave.
Por lo tanto, podemos modificar nuestro último ejemplo de la siguiente manera:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;
Resultado:
NOMBRE DEL EMPLEADO |
---|
Bart |
ene |
Ava |
Rohit |
Monish |
Monish |
Monish |
Mía |
Rohit |
Pedro |
Ava |
Monish |
Monish |