【问题标题】:check if two select statement return same result on the given data set检查两个 select 语句是否在给定数据集上返回相同的结果
【发布时间】:2016-04-01 01:34:14
【问题描述】:
(select * from query1 EXCEPT select * from query2)
 UNION ALL 
(select * from query2 EXCEPT select * from query1)

我遇到了上面的查询来解决这个问题。 我在 postgres 9.4 上做了一些试验,这是我的结果。

1 Minus 不支持,所以需要使用 EXCEPT

[2] 仅使用 EXCEPT 不会考虑重复,因此必须使用 EXCEPT ALL

[3] EXCEPT ALL 要求结果中的列顺序应该相同,因此在上面的查询中 QUERY1QUERY2 应该返回相同的列顺序,或者我们必须包装查询并确保列顺序是一样。(可能是在应用程序逻辑中发生)

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

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

【问题讨论】:

  • 没有主键,这个查询没有意义。如果你真的需要它,为什么不select * from q1 union select * from q2

标签: sql postgresql sql-except


【解决方案1】:

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

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)

将保证相同的行具有相同的顺序。

【讨论】:

  • 在查询中如果你使用except all 而不是except 那么重复将被正确解决..我在[2]点中提到过
猜你喜欢
  • 2017-10-11
  • 2020-10-27
  • 2011-02-16
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多