如何找出2个查询将返回不同结果的位置

时间:2015-07-30 19:32:10

标签: sql oracle

所以我刚刚修复了一个使用错误列的查询来查找特定用户的最新行:

在:

SELECT * FROM AUDIT_TABLE 
WHERE PRODUCT_ID = :someId AND USER_NAME = :someUser AND ROWNUM=1 
ORDER BY THE_WRONG_COLUMN DESC

后:

SELECT * FROM AUDIT_TABLE 
WHERE PRODUCT_ID = :someId AND USER_NAME = :someUser AND ROWNUM=1 
ORDER BY SEQUENTIAL_ROW_ID DESC

我是否可以运行查询来确定在单个用户的2个查询之间给出不同结果的所有Product_ID?

2 个答案:

答案 0 :(得分:5)

几乎可以肯定,这些查询都没有按照您的想法进行。两者都获得与product_iduser_name匹配的任意第一行,然后按the_wrong_columnsequential_row_id对该行进行排序。由于根据定义对单行进行排序不会影响结果的顺序,因此order by在两种情况下都毫无意义。

如果您打算获得符合product_iduser_name条件的行,然后获取最大sequential_row_id行,则需要在内联视图中进行排序然后才应用rownum谓词

SELECT *
  FROM (SELECT *
          FROM audit_table
         WHERE product_id = :something
           AND user_name  = :somethingElse
         ORDER BY sequential_row_id)
 WHERE rownum = 1

通常,您可以使用MINUS比较两个查询的结果,以查看一个查询返回的行,而另一个查询没有。如果您的查询获得了您期望的行,我建议您执行类似

的操作
SELECT *
  FROM (SELECT a.*,
               row_number() over (partition by product_id, user_name
                                       order by bad_column) rn
          FROM audit_table)
 WHERE rn = 1
MINUS
SELECT *
  FROM (SELECT a.*,
               row_number() over (partition by product_id, user_name
                                       order by sequential_id_column) rn
          FROM audit_table)
 WHERE rn = 1

这将显示坏查询将返回的每一行,好的查询不会。您可以反转MINUS以查看好查询将返回的所有内容,即错误查询不会返回。

答案 1 :(得分:1)

我相信您可以使用MIUNS函数,它类似于SQL Server中的EXCEPT

SELECT a, b, c
FROM   table_a
MINUS
SELECT a, b, c
FROM   table_b

这是一个原始的例子。您基本上选择了第一个查询并删除了第二个查询提出的任何内容,从而产生了差异

相关问题