所以我刚刚修复了一个使用错误列的查询来查找特定用户的最新行:
在:
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?
答案 0 :(得分:5)
几乎可以肯定,这些查询都没有按照您的想法进行。两者都获得与product_id
和user_name
匹配的任意第一行,然后按the_wrong_column
或sequential_row_id
对该行进行排序。由于根据定义对单行进行排序不会影响结果的顺序,因此order by
在两种情况下都毫无意义。
如果您打算获得符合product_id
和user_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
这是一个原始的例子。您基本上选择了第一个查询并删除了第二个查询提出的任何内容,从而产生了差异