Passer au contenu principal

Question

Comment puis-je vérifier que deux requêtes renvoient le même jeu de résultats ?

Réponse

Vous pouvez procéder comme suit :
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
Cet exemple utilise une CTE pour calculer la somme de la valeur cityHash de chaque ligne dans ces deux requêtes, et renverra 1 si les deux jeux de résultats sont identiques. En utilisant une séquence de nombres entiers et un formatage 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 Pretty
renvoie :
┏━━━━━━━━━━━━━━┓
┃ Q1_equals_Q2 ┃
┡━━━━━━━━━━━━━━┩
│            1 │
└──────────────┘
Bien que cela puisse être pratique dans de nombreux cas, cette méthode ne peut pas être considérée comme une solution miracle pour valider l’égalité des jeux de résultats pour tous les types, et son utilisation comporte certaines limites ; par exemple, si une ligne contient des valeurs NULL, l’approche ci-dessus échouera.
Dernière modification le 29 juin 2026