Jeśli otrzymujesz błąd „ORA-01789:blok zapytania ma nieprawidłową liczbę kolumn wynikowych” w bazie danych Oracle, to prawdopodobnie dlatego, że próbujesz użyć operatora, takiego jak UNION
, INTERSECT
lub EXCEPT
aby uruchomić zapytanie złożone, ale SELECT
instrukcje po obu stronach operatora zwracają inną liczbę kolumn.
Aby to naprawić, po prostu upewnij się, że oba zapytania zwracają tę samą liczbę kolumn.
Przykład błędu
Oto przykład kodu, który generuje błąd:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Wynik:
ORA-01789: query block has incorrect number of result columns
Tutaj używam UNION
operator, aby utworzyć zapytanie złożone. Niestety otrzymuję błąd, ponieważ w pierwszym zapytaniu umieściłem tylko jedną kolumnę, aw drugim dwie kolumny.
Rozwiązanie
Sposobem na rozwiązanie tego problemu jest upewnienie się, że oba zapytania zwracają tę samą liczbę kolumn.
Możemy więc albo dodać nową kolumnę do pierwszego SELECT
oświadczenie:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Wynik:
ID PRACOWNIKA | NAZWA PRACOWNIKA |
---|---|
1 | Bart |
1 | Mia |
2 | sty |
2 | Rohit |
3 | Awa |
3 | Piotr |
4 | Awa |
4 | Rohit |
5 | Pomnij |
6 | Pomnij |
7 | Pomnij |
Lub możemy usunąć jedną z kolumn z drugiego zapytania:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Wynik:
NAZWA PRACOWNIKA |
---|
Awa |
Bart |
sty |
Mia |
Pomnij |
Piotr |
Rohit |
Pamiętaj, że możesz uzyskać bardzo różne wyniki w zależności od używanej opcji. W rzeczywistości w powyższym przykładzie otrzymaliśmy różne wyniki.
Dzieje się tak, ponieważ UNION
operator zwraca różne wiersze, chyba że jest dołączony do ALL
słowo kluczowe. Kiedy uwzględniliśmy kolumny „ID”, to sprawiło, że niektóre wiersze były odrębne, gdy nie byłyby, gdybyśmy zwrócili tylko kolumny „nazwa”. Następnie, gdy wykluczyliśmy kolumny „ID”, otrzymaliśmy unikalne wartości z kolumn „name”.
Jeśli rzeczywiście chcesz, aby zwracane były zduplikowane wartości, możesz użyć ALL
słowo kluczowe.
Dlatego możemy zmodyfikować nasz ostatni przykład w następujący sposób:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;
Wynik:
NAZWA PRACOWNIKA |
---|
Bart |
sty |
Awa |
Rohit |
Pomnij |
Pomnij |
Pomnij |
Mia |
Rohit |
Piotr |
Awa |
Pomnij |
Pomnij |