检查两个"选择"是否相同

Vit*_*lio 22 sql oracle select

有没有办法检查两个(非平凡)选择是否相同?

- 编辑 -

最初我希望两个选项之间有正式的等价,但是证明-sql-query-equivalency的答案 阻止了我.

根据我的实际需要,我可以检查两个选项的(实际)结果是否相同.

HAL*_*000 32

如果要比较查询结果,请尝试以下操作:

(select * from query1 MINUS select * from query2) 
UNION ALL
(select * from query2 MINUS select * from query1)
Run Code Online (Sandbox Code Playgroud)

这将导致仅由一个查询返回的所有行.

  • 如果出现零行,那么它仍然不意味着查询在语义上是等效的.它只是意味着使用当前数据集它们会得到相同的结果.不过,对于原版海报来说,这可能已经足够了,但我认为值得指出. (14认同)
  • 这并不能确保行以相同的顺序返回。 (3认同)

Bog*_*dan 12

无法对HAL9000给出的答案发表评论,我想注意MINUS不是标准的SQL而且它在postgresql下不起作用所以我们需要使用EXCEPT代替

(select * from query1 EXCEPT select * from query2) 
UNION ALL
(select * from query2 EXCEPT select * from query1)
Run Code Online (Sandbox Code Playgroud)


Bhu*_*van 8

为了

(select * from query1 EXCEPT select * from query2)
 UNION ALL 
(select * from query2 EXCEPT select * from query1)
Run Code Online (Sandbox Code Playgroud)

我对 进行了一些试验postgres 9.4,这是我的结果。

[1] 不支持减号,因此需要EXCEPT按照@Bogdan 的说明使用

[2] Using onlyEXCEPT不考虑重复,所以必须使用EXCEPT ALL

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

所以我认为,如果我们牢记以上 3 点,我们可以 100% 确定对给定数据集的两个查询返回的数据完全相同。

如果我遇到更多可能失败的边缘情况,我会更新。