我在两个不同的数据库服务器上执行以下查询:
SELECT start_date,
end_date,
resort_id
FROM employee_activity
WHERE employee_id = 27
AND start_date < to_date('2012-11-09', 'YYYY-MM-DD')
AND is_overridden = 1
AND ROWNUM = 1
ORDER BY start_date DESC;此查询在Exadata上返回与其他服务器上不同的记录。在Exadata上,它首先选择第一行,然后执行排序。在另一个服务器上,它首先执行排序,然后返回第一行。
我们在两台服务器上都使用了Oracle 11g。
现在,我们面临的问题是,我们已经将数据库服务器升级到Exadata,并且在代码库中的许多地方都使用了这样的查询。那么,我们能否克服这个问题呢?
发布于 2015-08-27 07:10:21
这个答案是错误的,因为rownum的值是在执行order by之前分配的。
下面是正确的答案,
SELECT start_date,
end_date,
resort_id,
ROWNUM
FROM (SELECT start_date,
end_date,
resort_id
FROM employee_activity
WHERE employee_id = 27
AND start_date < TO_DATE ('2012-11-09', 'YYYY-MM-DD')
AND is_overridden = 1
ORDER BY start_date DESC
)
WHERE ROWNUM = 1https://dba.stackexchange.com/questions/35221
复制相似问题