Wenn Sie in Oracle Database den Fehler „ORA-01789:Abfrageblock hat falsche Anzahl von Ergebnisspalten“ erhalten, liegt das wahrscheinlich daran, dass Sie versuchen, einen Operator wie UNION
zu verwenden , INTERSECT
, oder EXCEPT
um eine zusammengesetzte Abfrage auszuführen, aber SELECT
Anweisungen auf beiden Seiten des Operators geben eine unterschiedliche Anzahl von Spalten zurück.
Um dies zu beheben, stellen Sie einfach sicher, dass beide Abfragen die gleiche Anzahl von Spalten zurückgeben.
Fehlerbeispiel
Hier ist ein Codebeispiel, das den Fehler erzeugt:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Ergebnis:
ORA-01789: query block has incorrect number of result columns
Hier verwende ich die UNION
-Operator zum Erstellen einer zusammengesetzten Abfrage. Leider erhalte ich eine Fehlermeldung, da ich in der ersten Abfrage nur eine Spalte, in der zweiten jedoch zwei Spalten eingefügt habe.
Lösung
Sie können dieses Problem beheben, indem Sie sicherstellen, dass beide Abfragen die gleiche Anzahl von Spalten zurückgeben.
Also können wir entweder dem ersten SELECT
eine neue Spalte hinzufügen Aussage:
SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;
Ergebnis:
MITARBEITERID | MITARBEITERNAME |
---|---|
1 | Bart |
1 | Mia |
2 | Januar |
2 | Rohit |
3 | Ava |
3 | Peter |
4 | Ava |
4 | Rohit |
5 | Monisch |
6 | Monisch |
7 | Monisch |
Oder wir könnten eine der Spalten aus der zweiten Abfrage entfernen:
SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;
Ergebnis:
MITARBEITERNAME |
---|
Ava |
Bart |
Januar |
Mia |
Monisch |
Peter |
Rohit |
Beachten Sie, dass Sie je nach verwendeter Option sehr unterschiedliche Ergebnisse erzielen können. Tatsächlich haben wir in unserem obigen Beispiel andere Ergebnisse erhalten.
Das liegt daran, dass die UNION
Der Operator gibt eindeutige Zeilen zurück, es sei denn, er wird mit ALL
angehängt Stichwort. Als wir die „ID“-Spalten einschlossen, wurden dadurch einige Zeilen deutlich, obwohl sie es nicht gewesen wären, wenn wir nur die „Name“-Spalten zurückgegeben hätten. Als wir dann die „ID“-Spalten ausschlossen, erhielten wir die eindeutigen Werte aus den „Name“-Spalten.
Wenn Sie tatsächlich doppelte Werte zurückgeben möchten, können Sie den ALL
verwenden Schlüsselwort.
Daher können wir unser letztes Beispiel wie folgt modifizieren:
SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;
Ergebnis:
MITARBEITERNAME |
---|
Bart |
Januar |
Ava |
Rohit |
Monisch |
Monisch |
Monisch |
Mia |
Rohit |
Peter |
Ava |
Monisch |
Monisch |