Ако получавате грешката „ORA-01789:блокът на заявката има неправилен брой колони с резултати“ в Oracle Database, това вероятно е защото се опитвате да използвате оператор като UNION
, INTERSECT
, или EXCEPT
за да изпълните съставна заявка, но SELECT
операторите от двете страни на оператора връщат различен брой колони.
За да коригирате това, просто се уверете, че и двете заявки връщат един и същ брой колони.
Пример за грешка
Ето пример за код, който създава грешката:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Резултат:
ORA-01789: query block has incorrect number of result columns
Тук използвам UNION
оператор за създаване на съставна заявка. За съжаление получавам грешка, защото включих само една колона в първата заявка, но две колони във втората.
Решение
Начинът за отстраняване на този проблем е да се уверите, че и двете заявки връщат същия брой колони.
Така че можем да добавим нова колона към първия SELECT
изявление:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Резултат:
ИД НА СЛУЖИТЕЛ | EMPLOYEENAME |
---|---|
1 | Барт |
1 | Миа |
2 | Януари |
2 | Рохит |
3 | Ава |
3 | Петър |
4 | Ава |
4 | Рохит |
5 | Мониш |
6 | Мониш |
7 | Мониш |
Или можем да премахнем една от колоните от втората заявка:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Резултат:
EMPLOYEENAME |
---|
Ава |
Барт |
Януари |
Миа |
Мониш |
Петър |
Рохит |
Имайте предвид, че можете да получите значително различни резултати в зависимост от опцията, която използвате. Всъщност в нашия пример по-горе получихме различни резултати.
Това е така, защото UNION
операторът връща отделни редове, освен ако не е добавен с ALL
ключова дума. Когато включихме колоните „ID“, това направи някои редове различни, когато те не биха били, ако върнахме само колоните „name“. След това, когато изключихме колоните „ID“, получихме уникалните стойности от колоните „name“.
Ако наистина искате да се върнат дублирани стойности, можете да използвате ALL
ключова дума.
Следователно можем да модифицираме последния ни пример, както следва:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;
Резултат:
EMPLOYEENAME |
---|
Барт |
Януари |
Ава |
Рохит |
Мониш |
Мониш |
Мониш |
Миа |
Рохит |
Петър |
Ава |
Мониш |
Мониш |