Se ricevi "ERRORE 1222 (21000):le istruzioni SELECT utilizzate hanno un numero diverso di colonne" quando usi UNION
clausola in una query MySQL, è probabilmente dovuto al numero di colonne restituite da ogni SELECT
l'affermazione è diversa.
Ad esempio, il primo SELECT
l'istruzione potrebbe restituire due colonne, ma la seconda SELECT
l'istruzione restituisce tre.
Per risolvere questo problema, assicurati che sia SELECT
le istruzioni restituiscono lo stesso numero di colonne.
Esempio di errore
Ecco un esempio di codice che produce l'errore:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Risultato:
ERROR 1222 (21000): The used SELECT statements have a different number of columns
Qui, il primo SELECT
l'istruzione restituisce una colonna (TeacherName
), ma il secondo SELECT
l'istruzione restituisce due colonne (StudentId
e StudentName
).
Soluzione
Il modo per risolvere questo problema è garantire entrambi SELECT
le istruzioni restituiscono lo stesso numero di colonne
Quindi, usando l'esempio sopra, possiamo rimuovere la colonna extra dal nostro secondo SELECT
dichiarazione:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Risultato:
+-------------+ | TeacherName | +-------------+ | Warren | | Ben | | Cathy | | Bill | | Faye | | Jet | | Spike | | Ein | +-------------+
Oppure possiamo aggiungere un'altra colonna al primo SELECT
dichiarazione:
SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Risultato:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 1 | Warren | | 2 | Ben | | 3 | Cathy | | 4 | Cathy | | 5 | Bill | | 6 | Bill | | 1 | Faye | | 2 | Jet | | 3 | Spike | | 4 | Ein | | 5 | Warren | +-----------+-------------+
Tieni presente che puoi ottenere risultati diversi a seconda dell'opzione che scegli. Questo perché UNION
restituisce righe distinte per impostazione predefinita. Quando aggiungiamo un'altra colonna, c'è la possibilità che una riga precedentemente duplicata ora diventi una riga univoca, a seconda del valore nella colonna extra.
Possiamo anche usare UNION ALL
, che restituisce valori duplicati:
SELECT TeacherId, TeacherName FROM Teachers
UNION ALL
SELECT StudentId, StudentName FROM Students;
Risultato:
+-----------+-------------+ | 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 | +-----------+-------------+