Вопрос
Как убедиться, что два запроса возвращают одинаковые наборы результатов?
Ответ
Можно использовать следующий подход:
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_Q2В этом примере используется CTE для вычисления суммы значений cityHash для каждой строки в этих двух запросах; если два набора результатов идентичны, будет возвращено 1.
Используем последовательность целых чисел и наглядное форматирование:
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 Prettyвернёт:
┏━━━━━━━━━━━━━━┓
┃ Q1_equals_Q2 ┃
┡━━━━━━━━━━━━━━┩
│ 1 │
└──────────────┘Хотя во многих случаях это может быть удобно, такой подход нельзя считать универсальным способом проверки равенства наборов результатов для всех типов, и при его использовании есть ряд оговорок. Например, если хотя бы одна строка содержит значения NULL, описанный выше подход не сработает.