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 要求结果中的列顺序应该相同,因此在上面的查询中QUERY1应该QUERY2返回相同的列顺序,或者我们必须包装查询并确保列顺序相同。(这可能发生在应用程序中逻辑)

因此,如果我们牢记以上三点,我们将 100% 确定我们的结果,对吧?

注意:我在问题的答案中也提到了上述 3 点。我已经在这里问过了,所以我可以确定

4

1 回答 1

0

不,您仍然没有得到保证,正如您可以从这个示例中看到的那样:

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

即使两个查询不相同,这也会返回 0 行。

问题是重复的。

一种方法是将一行中的所有值转换为一个公共值。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 回答