sql >> Databáze >  >> RDS >> Oracle

Oprava chyby „ORA-01789:blok dotazu má nesprávný počet sloupců výsledků“

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

  1. Nahrazení kurzorů SQL alternativami, abyste se vyhnuli problémům s výkonem

  2. Použití OASIS-SVN a git pro řízení zdrojového kódu Access

  3. Migrace sítě s nulovými výpadky s MySQL Galera Cluster pomocí Relay Node

  4. Jak detekovat znaky UTF-8 ve sloupci zakódovaném Latin1 - MySQL