sql >> Database teknologi >  >> RDS >> Oracle

Ret fejl "ORA-01789:forespørgselsblokken har forkert antal resultatkolonner"

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

  1. Beregner du et glidende gennemsnit i MySQL?

  2. Oracle:Hvad gør `(+)` i en WHERE-sætning?

  3. MySQL #1140 - Blanding af GROUP-kolonner

  4. Den korrekte måde at implementere en unik begrænsning, der tillader flere NULL-værdier i SQL Server