Pergunta
Como posso validar que duas consultas retornam o mesmo conjunto de resultados?
Resposta
Você pode usar a abordagem abaixo:
WITH
(
SELECT sum(cityHash64(*))
FROM
(
-- your query 1 here
-- SELECT ...
)
) AS q1_resultset_hash,
(
SELECT sum(cityHash64(*))
FROM
(
-- your query 2 here
-- SELECT ...
)
) AS q2_resultset_hash
SELECT equals(q1_resultset_hash,q2_resultset_hash) as Q1_equals_Q2O exemplo usa uma CTE para calcular a soma dos valores de cityHash de cada linha nessas duas consultas e retornará 1 se os dois conjuntos de resultados forem idênticos.
Usando alguns dados de sequência de inteiros e formatação Pretty:
WITH
(
SELECT sum(cityHash64(*))
FROM
(
SELECT *
FROM numbers(10)
ORDER BY number DESC
)
) AS q1_resultset_hash,
(
SELECT sum(cityHash64(*))
FROM
(
SELECT *
FROM numbers(10)
ORDER BY number ASC
)
) AS q2_resultset_hash
SELECT q1_resultset_hash = q2_resultset_hash AS Q1_equals_Q2
FORMAT Prettyretorna:
┏━━━━━━━━━━━━━━┓
┃ Q1_equals_Q2 ┃
┡━━━━━━━━━━━━━━┩
│ 1 │
└──────────────┘Embora isso possa ser útil em muitos cenários, não pode ser considerado uma solução definitiva para validar a igualdade de conjuntos de resultados para todos os tipos de dados, e há algumas ressalvas no seu uso; por exemplo, se alguma linha contiver valores NULL, a abordagem acima falhará.