2つの(自明ではない)selectが同等かどうかを確認する方法はありますか?
最初は2つのselectの正式な同等性を期待していましたが、 proving-sql-query-equivalency の回答で止められます。
私の実際の必要性については、2つの選択の(実際の)結果が同じかどうかを確認することができます。
クエリ結果を比較したい場合は、以下を試してください。
(select * from query1 MINUS select * from query2)
UNION ALL
(select * from query2 MINUS select * from query1)
これにより、すべての行が1つのクエリのみによって返されます。
HAL9000によって与えられた答えにコメントすることができなかったし、MINUSは標準SQLではなく、postgresqlでは機能しないことに注意したいので、代わりにEXCEPTを使用する必要があります
(select * from query1 EXCEPT select * from query2)
UNION ALL
(select * from query2 EXCEPT select * from query1)
For
(select * from query1 EXCEPT select * from query2)
UNION ALL
(select * from query2 EXCEPT select * from query1)
postgres 9.4
を試してみましたが、結果は次のとおりです。
[1]マイナスはサポートされていないため、@ Bogdanの指示に従ってEXCEPT
を使用する必要があります
[2] EXCEPT
のみを使用しても重複は考慮されないため、EXCEPT ALL
を使用する必要がありました
[3] EXCEPT ALL
では、結果の列の順序が同じである必要があるため、上記のクエリではQUERY1
とQUERY2
は同じ列の順序を返すか、クエリをラップして確認する必要があります。列の順序は同じです(これはアプリケーションロジックで発生する可能性があります)
したがって、3つ以上の点を念頭に置いておくと、特定のデータセットに対する2つのクエリによって返されるデータが完全に同じであることを100%確信できると思います。
失敗する可能性のあるEdgeケースに遭遇した場合に更新されます。
それらの両方を実行し、結果を比較します。 EXCEPT操作を使用して、2番目のクエリによって返されたセットから、最初のクエリによって返されたセットを減算します。結果が空のセットである場合、それらは同等です。
この方法の問題は、2つのクエリがすべてのデータベースで同等であることを証明しないことです。データベースの内容によって異なります。たとえば、DBが空の場合、このメソッドによると、2つのselectステートメントは同等です。
クエリを分析するだけで同等性を証明することは未解決の問題ですAFAIK(しかし、私はデータベース理論の第一人者ではないので、それを信用しないでください;))また、この質問を確認することもできます SQLの証明クエリ同値