1
(select * from query1 EXCEPT select * from query2)
 UNION ALL 
(select * from query2 EXCEPT select * from query1)

問題を解決するために上記のクエリに出くわしました。私は postgres 9.4 でいくつかの試行を行いました。これが私の結果です。

1マイナスはサポートされていないため、EXCEPT を使用する必要があります

[2] EXCEPT のみを使用すると重複が考慮されないため、EXCEPT ALL を使用する必要がありました

[3] EXCEPT ALL では、結果の列の順序が同じである必要があるため、上記のクエリQUERY1QUERY2同じ列の順序を返すか、クエリをラップして列の順序が同じであることを確認する必要があります (アプリケーションで発生する可能性があります)。論理)

したがって、上記の 3 点を念頭に置いておけば、結果について 100% 確信が持てますよね?

注: 上記の 3 点については、質問への回答でも言及しまし。こちらで確認したので質問させていただきました

4

1 に答える 1

0

いいえ、次の例からすぐにわかるように、まだ保証されていません。

select *
from (select 1 as x union all select 1) x
except
select 1;

2 つのクエリが同じでなくても、これは 0 行を返します。

問題は重複です。

1 つの方法は、行内のすべての値を共通の値に変換することです。Postgres には、これに関する興味深い構文があります。

select table_alias::text
from (. . . ) table_alias

これにより、すべての値が連結されます。これを式で使用できますrow_number()exceptこれをあなたが持っている表現に差し込むことができます。を追加row_number()すると、重複の問題が修正されます。の用法:

row_number() over (order by q1::text)

同一の行が同じ順序であることを保証します。

于 2015-12-26T15:22:36.713 に答える