Bei Verwendung von UNION
-Operator in PostgreSQL, wenn Sie auf einen Fehler stoßen, der lautet:„FEHLER:Jede UNION-Abfrage muss dieselbe Anzahl von Spalten haben “, liegt daran, dass die Anzahl der Spalten, die von den Abfragen auf beiden Seiten der UNION
zurückgegeben werden, nicht übereinstimmt Operator.
Dieser Fehler tritt auf, wenn die Anzahl der Spalten, die von jedem SELECT
zurückgegeben werden Aussage ist anders.
Um dies zu beheben, stellen Sie sicher, dass sowohl SELECT
Anweisungen geben die gleiche Anzahl von Spalten zurück.
Fehlerbeispiel
Hier ist ein Codebeispiel, das den Fehler erzeugt:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Ergebnis:
ERROR: each UNION query must have the same number of columns LINE 3: SELECT StudentId, StudentName FROM Students;
Hier das erste SELECT
-Anweisung gibt eine Spalte zurück (TeacherName
), aber das zweite SELECT
-Anweisung gibt zwei Spalten zurück (StudentId
und StudentName
).
Lösung
Die Lösung besteht darin, sowohl SELECT
sicherzustellen Anweisungen geben die gleiche Anzahl von Spalten zurück
Mit dem obigen Beispiel können wir entweder die zusätzliche Spalte aus unserem zweiten SELECT
entfernen Aussage:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Oder wir können dem ersten SELECT
eine weitere Spalte hinzufügen Aussage:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Es ist wichtig zu beachten, dass Sie je nach gewählter Option unterschiedliche Ergebnisse erhalten können. Dies liegt daran, dass UNION
gibt standardmäßig unterschiedliche Zeilen zurück. Wenn wir eine weitere Spalte hinzufügen, besteht die Möglichkeit, dass eine zuvor duplizierte Zeile jetzt zu einer eindeutigen Zeile wird, abhängig vom Wert in der zusätzlichen Spalte.
Wir können auch UNION ALL
verwenden , die doppelte Werte zurückgibt:
SELECT TeacherId, TeacherName FROM Teachers
UNION ALL
SELECT StudentId, StudentName FROM Students;
Dies kann auch andere Ergebnisse als die anderen Beispiele zurückgeben.