質問
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 を使って、これら 2 つのクエリにおける各行の cityHash 値の合計を計算し、2 つの結果セットが同一であれば 1 を返します。
整数のシーケンスデータと 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次が返されます。
┏━━━━━━━━━━━━━━┓
┃ Q1_equals_Q2 ┃
┡━━━━━━━━━━━━━━┩
│ 1 │
└──────────────┘これは多くの場面で便利ですが、あらゆる型の結果セットの等価性を検証する万能策とは言えず、利用にはいくつか注意点があります。たとえば、いずれかの行に NULL 値が含まれている場合、上記の方法は機能しません。