MySQL compara duas tabelas

Resumo : neste tutorial, você aprenderá como comparar duas tabelas para encontrar os registros sem correspondência.

Na migração de dados, é comum comparar duas tabelas para identificar um registro em uma tabela que não possui entradas correspondentes em outra tabela.

Por exemplo, considere um cenário em que um novo banco de dados possui um esquema diferente do banco de dados legado. O objetivo é migrar todos os dados do banco de dados legado para o novo garantindo a precisão da migração.

Para validar os dados, temos que comparar duas tabelas, uma no novo banco de dados e outra no banco de dados legado, e identificar os registros que não possuem correspondência.

Vamos pegar duas tabelas t1e t2como exemplo.

As etapas a seguir descrevem o processo de comparação de duas tabelas e identificação de registros sem correspondência:

Primeiro, use a instrução UNION para combinar linhas em ambas as tabelas; inclua apenas as colunas que deseja comparar.

SELECT 
  t1.pk, 
  t1.c1 
FROM 
  t1 
UNION ALL 
SELECT 
  t2.pk, 
  t2.c1 
FROM 
  t2Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta instrução, t1.pk e t2.pk são as colunas de chave primária das tabelas e t1.c1 e t2.c2 são as colunas que você deseja comparar.

Segundo, agrupe as linhas com base na chave primária e nas colunas que deseja comparar.

Se os valores nas colunas que você deseja comparar forem idênticos, retornará HAVING COUNT(*)2, caso contrário, retornará 1:

SELECT pk, c1
FROM
 (
   SELECT t1.pk, t1.c1
   FROM t1
   UNION ALL
   SELECT t2.pk, t2.c1
   FROM t2
)  t
GROUP BY pk, c1
HAVING COUNT(*) = 1
ORDER BY pkLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Se os valores nas colunas envolvidas na comparação forem idênticos, a consulta não retornará nenhuma linha.

Exemplo de comparação de duas tabelas

Primeiro, crie duas novas tabelas chamadas t1e t2:

CREATE TABLE t1(
  id int auto_increment primary key, 
  title varchar(255)
);

CREATE TABLE t2(
  id int auto_increment primary key, 
  title varchar(255), 
  note varchar(255)
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, insira dados em t1tabelas t2:

INSERT INTO t1(title) 
VALUES 
  ('row 1'), 
  ('row 2'), 
  ('row 3');
  
INSERT INTO t2(title, note) 
SELECT 
  title, 
  'data migration' 
FROM 
  t1;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, compare os valores da coluna ide titlede ambas as tabelas:

SELECT 
  id, 
  title 
FROM 
  (
    SELECT 
      id, 
      title 
    FROM 
      t1 
    UNION ALL 
    SELECT 
      id, 
      title 
    FROM 
      t2
  ) tbl 
GROUP BY 
  id, 
  title 
HAVING 
  count(*) = 1 
ORDER BY 
  id;
Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

Empty set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

A consulta não retorna nenhuma linha porque não há registros sem correspondência.

Quarto, insira uma nova linha na tabela t2:

INSERT INTO t2(title, note) 
VALUES 
  ('new row 4', 'new');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Quinto, execute a consulta para comparar novamente os valores da titlecoluna em ambas as tabelas:

SELECT 
  id, 
  title 
FROM 
  (
    SELECT 
      id, 
      title 
    FROM 
      t1 
    UNION ALL 
    SELECT 
      id, 
      title 
    FROM 
      t2
  ) tbl 
GROUP BY 
  id, 
  title 
HAVING 
  count(*) = 1 
ORDER BY 
  id;

A nova linha, que é a linha sem correspondência, deve retornar:

+----+-----------+
| id | title     |
+----+-----------+
|  4 | new row 4 |
+----+-----------+
1 row in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

Resumo

  • Use as cláusulas GROUP BYe HAVING COUNTpara comparar o conteúdo de duas tabelas para localizar os registros sem correspondência.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *