Als u de foutmelding "ORA-01789:queryblok heeft onjuist aantal resultaatkolommen" krijgt in Oracle Database, komt dit waarschijnlijk omdat u een operator zoals UNION
probeert te gebruiken , INTERSECT
, of EXCEPT
om een samengestelde query uit te voeren, maar de SELECT
uitspraken aan weerszijden van de operator leveren een ander aantal kolommen op.
Om dit op te lossen, moet u ervoor zorgen dat beide zoekopdrachten hetzelfde aantal kolommen retourneren.
Voorbeeld van fout
Hier is een voorbeeld van code die de fout veroorzaakt:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Resultaat:
ORA-01789: query block has incorrect number of result columns
Hier gebruik ik de UNION
operator om een samengestelde query te maken. Helaas krijg ik een foutmelding, omdat ik slechts één kolom in de eerste query heb opgenomen, maar twee kolommen in de tweede.
Oplossing
De manier om dit probleem op te lossen, is ervoor te zorgen dat beide query's hetzelfde aantal kolommen retourneren.
We kunnen dus ofwel een nieuwe kolom toevoegen aan de eerste SELECT
verklaring:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Resultaat:
WERKNEMER-ID | NAAM WERKNEMER |
---|---|
1 | Bart |
1 | Mia |
2 | Jan |
2 | Rohit |
3 | Ava |
3 | Peter |
4 | Ava |
4 | Rohit |
5 | Monish |
6 | Monish |
7 | Monish |
Of we kunnen een van de kolommen uit de tweede zoekopdracht verwijderen:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Resultaat:
NAAM WERKNEMER |
---|
Ava |
Bart |
Jan |
Mia |
Monish |
Peter |
Rohit |
Houd er rekening mee dat u enorm verschillende resultaten kunt krijgen, afhankelijk van de optie die u gebruikt. In ons voorbeeld hierboven kregen we zelfs verschillende resultaten.
Dit komt omdat de UNION
operator geeft verschillende rijen terug, tenzij deze is toegevoegd met de ALL
trefwoord. Toen we de "ID"-kolommen invoegden, maakte dit sommige rijen duidelijk wanneer ze niet zouden zijn geweest als we alleen de "naam" -kolommen hadden geretourneerd. Toen we de "ID"-kolommen uitsloten, kregen we de unieke waarden van de "naam" -kolommen.
Als u dubbele waarden wilt retourneren, kunt u de ALL
. gebruiken zoekwoord.
Daarom kunnen we ons laatste voorbeeld als volgt aanpassen:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;
Resultaat:
NAAM WERKNEMER |
---|
Bart |
Jan |
Ava |
Rohit |
Monish |
Monish |
Monish |
Mia |
Rohit |
Peter |
Ava |
Monish |
Monish |