Om du får felet "ORA-01789:frågeblocket har felaktigt antal resultatkolumner" i Oracle Database, beror det förmodligen på att du försöker använda en operator som UNION
, INTERSECT
, eller EXCEPT
för att köra en sammansatt fråga, men SELECT
satser på vardera sidan av operatorn returnerar ett annat antal kolumner.
För att åtgärda detta, se bara till att båda frågorna returnerar samma antal kolumner.
Exempel på fel
Här är ett exempel på kod som ger felet:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Resultat:
ORA-01789: query block has incorrect number of result columns
Här använder jag UNION
operatör för att skapa en sammansatt fråga. Tyvärr får jag ett felmeddelande eftersom jag bara har inkluderat en kolumn i den första frågan, men två kolumner i den andra.
Lösning
Sättet att lösa detta problem är att se till att båda frågorna returnerar samma antal kolumner.
Så vi kan antingen lägga till en ny kolumn till den första SELECT
uttalande:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Resultat:
ANSTÄLLDA ID | EMPLOYEENAME |
---|---|
1 | Bart |
1 | Mia |
2 | Jan |
2 | Rohit |
3 | Ava |
3 | Peter |
4 | Ava |
4 | Rohit |
5 | Monish |
6 | Monish |
7 | Monish |
Eller så kan vi ta bort en av kolumnerna från den andra frågan:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Resultat:
EMPLOYEENAME |
---|
Ava |
Bart |
Jan |
Mia |
Monish |
Peter |
Rohit |
Tänk på att du kan få väldigt olika resultat beroende på vilket alternativ du använder. Faktum är att vi fick olika resultat i vårt exempel ovan.
Detta beror på att UNION
operatorn returnerar distinkta rader om den inte har lagts till med ALL
nyckelord. När vi inkluderade "ID"-kolumnerna gjorde detta vissa rader distinkta när de inte skulle ha varit om vi bara hade returnerat "namn"-kolumnerna. När vi sedan exkluderade "ID"-kolumnerna fick vi de unika värdena från "name"-kolumnerna.
Om du verkligen vill ha dubbletter av värden returnerade kan du använda ALL
nyckelord.
Därför kan vi modifiera vårt sista exempel enligt följande:
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 |