Jeśli otrzymujesz komunikat „Błąd:w przygotowaniu, SELECTy po lewej i prawej stronie UNION nie mają takiej samej liczby kolumn wynikowych…” podczas próby użycia UNION
operator w SQLite, to dlatego, że jeden z SELECT
oświadczenie zwraca więcej kolumn niż inne.
Kiedy używasz UNION
operator, oba SELECT
oświadczenia muszą zwracać taką samą liczbę kolumn.
Aby rozwiązać ten problem, upewnij się, że SELECT
oświadczenia zwracają tę samą liczbę kolumn.
Przykład błędu
Oto przykład kodu SQL, który powoduje błąd:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Wynik:
Error: in prepare, SELECTs to the left and right of UNION do not have the same number of result columns (1)
Tutaj pierwszy SELECT
instrukcja zwraca jedną kolumnę (TeacherName
), ale drugi SELECT
instrukcja zwraca dwie kolumny (StudentId
i StudentName
).
Rozwiązanie
Sposobem na rozwiązanie tego problemu jest zapewnienie obu opcji SELECT
oświadczenia zwracają tę samą liczbę kolumn
Korzystając z powyższego przykładu, możemy albo usunąć dodatkową kolumnę z naszego drugiego SELECT
oświadczenie:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Wynik:
TeacherName ----------- Ben Bill Cathy Ein Faye Jet Spike Warren
Lub możemy dodać kolejną kolumnę do pierwszego SELECT
oświadczenie:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Wynik:
TeacherId TeacherName --------- ----------- 1 Faye 1 Warren 2 Ben 2 Jet 3 Cathy 3 Spike 4 Cathy 4 Ein 5 Bill 5 Warren 6 Bill
Pamiętaj, że możesz uzyskać różne wyniki w zależności od wybranej opcji. Dzieje się tak, ponieważ UNION
domyślnie zwraca różne wiersze. Kiedy dodamy kolejną kolumnę, istnieje możliwość, że poprzednio zduplikowany wiersz stanie się teraz unikalnym wierszem, w zależności od wartości w dodatkowej kolumnie.
Możemy również użyć UNION ALL
, który zwraca zduplikowane wartości:
SELECT TeacherId, TeacherName FROM Teachers
UNION ALL
SELECT StudentId, StudentName FROM Students;
Wynik:
TeacherId TeacherName --------- ----------- 1 Warren 2 Ben 3 Cathy 4 Cathy 5 Bill 6 Bill 1 Faye 2 Jet 3 Spike 4 Ein 5 Warren 6 Bill