Hvis du får fejlen "ORA-01789:forespørgselsblok har forkert antal resultatkolonner" i Oracle Database, så er det sandsynligvis fordi du forsøger at bruge en operator såsom UNION
, INTERSECT
, eller EXCEPT
at køre en sammensat forespørgsel, men SELECT
sætninger på hver side af operatoren returnerer et andet antal kolonner.
For at løse dette skal du blot sikre dig, at begge forespørgsler returnerer det samme antal kolonner.
Eksempel på fejl
Her er et eksempel på kode, der producerer fejlen:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Resultat:
ORA-01789: query block has incorrect number of result columns
Her bruger jeg UNION
operatør for at oprette en sammensat forespørgsel. Desværre får jeg en fejl, fordi jeg kun har inkluderet én kolonne i den første forespørgsel, men to kolonner i den anden.
Løsning
Måden at løse dette problem på er at sikre, at begge forespørgsler returnerer det samme antal kolonner.
Så vi kan enten tilføje en ny kolonne til den første SELECT
erklæring:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Resultat:
EMPLOYEEID | EMPLOYEENAME |
---|---|
1 | Bart |
1 | Mia |
2 | Jan |
2 | Rohit |
3 | Ava |
3 | Peter |
4 | Ava |
4 | Rohit |
5 | Monish |
6 | Monish |
7 | Monish |
Eller vi kunne fjerne en af kolonnerne fra den anden forespørgsel:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Resultat:
EMPLOYEENAME |
---|
Ava |
Bart |
Jan |
Mia |
Monish |
Peter |
Rohit |
Vær opmærksom på, at du kan få vidt forskellige resultater afhængigt af den mulighed, du bruger. Faktisk fik vi forskellige resultater i vores eksempel ovenfor.
Dette skyldes, at UNION
operator returnerer distinkte rækker, medmindre den er tilføjet ALL
søgeord. Da vi inkluderede "ID"-kolonnerne, gjorde dette nogle rækker forskellige, når de ikke ville have været, hvis vi kun havde returneret "navn"-kolonnerne. Da vi så ekskluderede "ID"-kolonnerne, fik vi de unikke værdier fra "navn"-kolonnerne.
Hvis du rent faktisk vil have duplikerede værdier returneret, kan du bruge ALL
søgeord.
Derfor kan vi ændre vores sidste eksempel som følger:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;
Resultat:
EMPLOYEENAME |
---|
Bart |
Jan |
Ava |
Rohit |
Monish |
Monish |
Monish |
Mia |
Rohit |
Peter |
Ava |
Monish |
Monish |