Pokud se vám v databázi Oracle zobrazuje chyba „ORA-01789:blok dotazu má nesprávný počet sloupců výsledků“, je to pravděpodobně proto, že se pokoušíte použít operátor, jako je UNION
, INTERSECT
nebo EXCEPT
spustit složený dotaz, ale SELECT
příkazy na obou stranách operátoru vracejí jiný počet sloupců.
Chcete-li to vyřešit, jednoduše zajistěte, aby oba dotazy vracely stejný počet sloupců.
Příklad chyby
Zde je příklad kódu, který způsobuje chybu:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Výsledek:
ORA-01789: query block has incorrect number of result columns
Zde používám UNION
operátor k vytvoření složeného dotazu. Bohužel dostávám chybu, protože jsem do prvního dotazu zahrnul pouze jeden sloupec, ale do druhého dva sloupce.
Řešení
Způsob, jak tento problém vyřešit, je zajistit, aby oba dotazy vracely stejný počet sloupců.
Můžeme tedy buď přidat nový sloupec do prvního SELECT
prohlášení:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Výsledek:
ID ZAMĚSTNANCE | EMPLOYEENAME |
---|---|
1 | Bart |
1 | Mia |
2 | Leden |
2 | Rohit |
3 | Ava |
3 | Petr |
4 | Ava |
4 | Rohit |
5 | Monština |
6 | Monština |
7 | Monština |
Nebo bychom mohli odstranit jeden ze sloupců z druhého dotazu:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Výsledek:
JMÉNO ZAMĚSTNANCE |
---|
Ava |
Bart |
Jan |
Mia |
Monish |
Petr |
Rohit |
Mějte na paměti, že můžete získat výrazně odlišné výsledky v závislosti na možnosti, kterou používáte. Ve skutečnosti jsme v našem příkladu výše dostali jiné výsledky.
Je to proto, že UNION
Operátor vrací odlišné řádky, pokud k němu není připojen znak ALL
klíčové slovo. Když jsme zahrnuli sloupce „ID“, některé řádky se odlišily, pokud by nebyly, kdybychom vrátili pouze sloupce „název“. Když jsme pak vyloučili sloupce „ID“, získali jsme jedinečné hodnoty ze sloupců „name“.
Pokud skutečně chcete vrátit duplicitní hodnoty, můžete použít ALL
klíčové slovo.
Náš poslední příklad tedy můžeme upravit následovně:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;
Výsledek:
JMÉNO ZAMĚSTNANCE |
---|
Bart |
Jan |
Ava |
Rohit |
Monish |
Monish |
Monish |
Mia |
Rohit |
Petr |
Ava |
Monish |
Monština |