Перейти к основному содержанию

Вопрос

Как убедиться, что два запроса возвращают одинаковые наборы результатов?

Ответ

Можно использовать следующий подход:
WITH
    (
        SELECT sum(cityHash64(*))
        FROM
        (
            -- ваш запрос 1 здесь
            -- SELECT ...
        )
    ) AS q1_resultset_hash,
    (
        SELECT sum(cityHash64(*))
        FROM
        (
            -- ваш запрос 2 здесь
            -- 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, описанный выше подход не сработает.
Последнее изменение 10 июня 2026 г.