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 t1
e t2
como 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
t2
Linguagem 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 pk
Linguagem 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 t1
e 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 t1
tabelas 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 id
e title
de 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 title
coluna 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 BY
eHAVING COUNT
para comparar o conteúdo de duas tabelas para localizar os registros sem correspondência.