Se você está recebendo "ERROR 1222 (21000):as instruções SELECT usadas têm um número diferente de colunas" ao usar o
UNION
cláusula em uma consulta MySQL, provavelmente é porque o número de colunas retornadas por cada SELECT
afirmação é diferente. Por exemplo, o primeiro
SELECT
pode retornar duas colunas, mas a segunda SELECT
declaração retorna três. Para corrigir esse problema, certifique-se de que
SELECT
instruções retornam o mesmo número de colunas. Exemplo de erro
Aqui está um exemplo de código que produz o erro:
SELECT TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Resultado:
ERROR 1222 (21000): The used SELECT statements have a different number of columns
Aqui, o primeiro
SELECT
retorna uma coluna (TeacherName
), mas o segundo SELECT
retorna duas colunas (StudentId
e StudentName
). Solução
A maneira de corrigir esse problema é garantir que
SELECT
instruções retornam o mesmo número de colunas Então, usando o exemplo acima, podemos remover a coluna extra do nosso segundo
SELECT
demonstração:SELECT TeacherName FROM Teachers
UNION
SELECT StudentName FROM Students;
Resultado:
+-------------+ | TeacherName | +-------------+ | Warren | | Ben | | Cathy | | Bill | | Faye | | Jet | | Spike | | Ein | +-------------+
Ou podemos adicionar outra coluna ao primeiro
SELECT
demonstração:SELECT TeacherId, TeacherName FROM Teachers
UNION
SELECT StudentId, StudentName FROM Students;
Resultado:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 1 | Warren | | 2 | Ben | | 3 | Cathy | | 4 | Cathy | | 5 | Bill | | 6 | Bill | | 1 | Faye | | 2 | Jet | | 3 | Spike | | 4 | Ein | | 5 | Warren | +-----------+-------------+
Esteja ciente de que você pode obter resultados diferentes dependendo da opção escolhida. Isso ocorre porque
UNION
retorna linhas distintas por padrão. Quando adicionamos outra coluna, existe a possibilidade de que uma linha anteriormente duplicada agora se torne uma linha única, dependendo do valor da coluna extra. Também podemos usar
UNION ALL
, que retorna valores duplicados:SELECT TeacherId, TeacherName FROM Teachers
UNION ALL
SELECT StudentId, StudentName FROM Students;
Resultado:
+-----------+-------------+ | 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 | +-----------+-------------+