Se ricevi l'errore "ORA-01789:il blocco della query ha un numero errato di colonne dei risultati" in Oracle Database, probabilmente è perché stai cercando di utilizzare un operatore come UNION
, INTERSECT
o EXCEPT
per eseguire una query composta, ma il SELECT
le istruzioni su entrambi i lati dell'operatore restituiscono un numero diverso di colonne.
Per risolvere questo problema, assicurati semplicemente che entrambe le query restituiscano lo stesso numero di colonne.
Esempio di errore
Ecco un esempio di codice che produce l'errore:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Risultato:
ORA-01789: query block has incorrect number of result columns
Qui sto usando UNION
operatore per creare una query composta. Sfortunatamente ricevo un errore, perché ho incluso solo una colonna nella prima query, ma due colonne nella seconda.
Soluzione
Il modo per risolvere questo problema è assicurarsi che entrambe le query restituiscano lo stesso numero di colonne.
Quindi possiamo aggiungere una nuova colonna al primo SELECT
dichiarazione:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Risultato:
ID DIPENDENTE | NOME DIPENDENTE |
---|---|
1 | Bart |
1 | Mia |
2 | gennaio |
2 | Rohit |
3 | Ava |
3 | Pietro |
4 | Ava |
4 | Rohit |
5 | Monish |
6 | Monish |
7 | Monish |
Oppure potremmo rimuovere una delle colonne dalla seconda query:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Risultato:
DIPENDENTE |
---|
Ava |
Bart |
Gen |
Mia |
Monish |
Pietro |
Rohit |
Tieni presente che puoi ottenere risultati molto diversi a seconda dell'opzione che utilizzi. In effetti, abbiamo ottenuto risultati diversi nel nostro esempio sopra.
Questo perché il UNION
l'operatore restituisce righe distinte a meno che non sia aggiunto il ALL
parola chiave. Quando abbiamo incluso le colonne "ID", alcune righe sono state distinte quando non sarebbero state se avessimo restituito solo le colonne "nome". Quindi, quando abbiamo escluso le colonne "ID", abbiamo ottenuto i valori univoci dalle colonne "nome".
Se desideri effettivamente restituire valori duplicati, puoi utilizzare ALL
parola chiave.
Pertanto, possiamo modificare il nostro ultimo esempio come segue:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;
Risultato:
DIPENDENTE |
---|
Bart |
Gen |
Ava |
Rohit |
Monish |
Monish |
Monish |
Mia |
Rohit |
Pietro |
Ava |
Monish |
Monish |