sql >> Databasteknik >  >> RDS >> Oracle

Åtgärda felet "ORA-01789:frågeblocket har felaktigt antal resultatkolumner"

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

  1. Framtvinga en tidsgräns för fråga i SQL Server

  2. Postgres - Konvertera angränsande lista till kapslade JSON-objekt

  3. Postgres-funktionen returnerar tabell som inte returnerar data i kolumner

  4. Hur man e-postar resultaten av en fråga i SQL Server (T-SQL)