🔹 1. Solução com Query Simples (USING JOIN)
Esta abordagem usa JOIN para unir as tabelas com base no ClienteID e prioriza os valores mais recentes.
SELECT
COALESCE(B.ClienteID, A.ClienteID) AS ClienteID,
COALESCE(B.Nome, A.Nome) AS Nome, -- Prioriza Nome da tabela mais recente, mantendo o antigo se for NULL
COALESCE(B.Email, A.Email) AS Email, -- Prioriza Email da mais recente, mantendo o antigo se for NULL
B.DataAtualizacao
FROM
Clientes_SistemaA A
FULL JOIN Clientes_SistemaB B
ON A.ClienteID = B.ClienteID
WHERE
B.DataAtualizacao >= A.DataAtualizacao OR
A.DataAtualizacao IS NULL;
✅ Vantagens:
- Simples e eficiente para um conjunto menor de dados.
- Fácil leitura e manutenção.
❌ Desvantagens:
- Pode ser menos eficiente em tabelas grandes, pois FULL JOIN pode ser pesado.
🔹 2. Solução com Common Table Expression (CTE)
Aqui utilizamos CTE para organizar a seleção e facilitar a reutilização da consulta.
WITH DadosMestres AS (
SELECT
COALESCE(B.ClienteID, A.ClienteID) AS ClienteID,
COALESCE(B.Nome, A.Nome) AS Nome,
COALESCE(B.Email, A.Email) AS Email,
B.DataAtualizacao
FROM
Clientes_SistemaA A
FULL JOIN Clientes_SistemaB B
ON A.ClienteID = B.ClienteID
WHERE
B.DataAtualizacao >= A.DataAtualizacao OR
A.DataAtualizacao IS NULL )
SELECT * FROM DadosMestres;
✅ Vantagens:
- Melhor organização e legibilidade do código.
- Facilita a reutilização dentro de consultas mais complexas.
❌ Desvantagens:
- Pode não ter um ganho real de performance em relação à query simples.
🔹 3. Solução com MERGE (Atualizando uma Tabela Mestre)
Aqui utilizamos MERGE para consolidar os dados em uma única tabela Clientes_Mestre.
MERGE INTO Clientes_Mestre AS CM
USING (
SELECT
COALESCE(B.ClienteID, A.ClienteID) AS ClienteID,
COALESCE(B.Nome, A.Nome) AS Nome,
COALESCE(B.Email, A.Email) AS Email,
B.DataAtualizacao
FROM
Clientes_SistemaA A
FULL JOIN Clientes_SistemaB B
ON A.ClienteID = B.ClienteID
WHERE
B.DataAtualizacao >= A.DataAtualizacao OR
A.DataAtualizacao IS NULL
) AS Fonte
ON CM.ClienteID = Fonte.ClienteID
WHEN MATCHED THEN
UPDATE SET
CM.Nome = Fonte.Nome,
CM.Email = Fonte.Email,
CM.DataAtualizacao = Fonte.DataAtualizacao
WHEN NOT MATCHED THEN
INSERT (ClienteID, Nome, Email, DataAtualizacao)
VALUES (Fonte.ClienteID, Fonte.Nome, Fonte.Email, Fonte.DataAtualizacao);
✅ Vantagens:
- Mais eficiente para grandes volumes de dados, pois evita duplicação.
- Permite a criação de uma tabela mestre consolidada, ideal para sistemas de MDM.
❌ Desvantagens:
- Mais complexo e pode ser mais pesado se rodado frequentemente.
- o.
4️⃣ Usando Views Indexadas ou Materializadas
💡 Boa para consolidar os dados permanentemente e otimizar consultas frequentes.
CREATE VIEW vw_ClientesAtualizados AS
SELECT
COALESCE(B.ClienteID, A.ClienteID) AS ClienteID,
COALESCE(B.Nome, A.Nome) AS Nome,
COALESCE(B.Email, A.Email) AS Email,
B.DataAtualizacao
FROM
Clientes_SistemaA A
FULL JOIN Clientes_SistemaB B
ON A.ClienteID = B.ClienteID
WHERE
B.DataAtualizacao >= A.DataAtualizacao OR
A.DataAtualizacao IS NULL;
✅ Vantagens:
- Boa para consultas recorrentes, pois evita cálculos repetidos.
- Pode ser indexada para ganho de performance.
❌ Desvantagens:
- Não armazena fisicamente os dados (a menos que seja uma view materializada, que alguns bancos suportam).
📊 Comparação de Performance
✅ Conclusão:
Se for uma simples análise pontual, a query com JOIN ou CTE é suficiente.
Se precisar consolidar dados permanentemente, MERGE é a melhor escolha! 🚀