跳至主要内容

如何验证两个查询返回相同的结果集?

·阅读时间:2分钟

问题

如何验证两个查询返回相同的结果集?

答案

您可以使用以下方法

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 值,则上述方法将失败。