组前和组后使用rownum的区别

时间:2017-08-01 01:58:54

标签: sql oracle group-by rownum

我想知道以下两个查询之间的区别

  SELECT INVN46, MTER46,CHRE46,CTSQ46, INFR46, INTO46
  FROM AULFXAF2.SSP46L01@FXA400HA10G 
  inner join Invoice_line_in line on line.invoice_line_id = trim(RECT46)|| '+'  || trim(INVN46) || '+' || trim(INVL46)
  where line.invoice_line_id like 'IN+Q%'
  and rownum <=1000
  group by INVN46, MTER46,CHRE46,CTSQ46, INFR46, INTO46;

  select * from 
  (SELECT INVN46, MTER46,CHRE46,CTSQ46, INFR46, INTO46
  FROM AULFXAF2.SSP46L01@FXA400HA10G 
  inner join Invoice_line_in line on line.invoice_line_id = trim(RECT46)|| '+'  || trim(INVN46) || '+' || trim(INVL46)
  where line.invoice_line_id like 'IN+Q%'
  group by INVN46, MTER46,CHRE46,CTSQ46, INFR46, INTO46)
  where rownum <=1000

哪一个准确而快速?根据我的理解,首先获得1000条记录,然后将它们组合在一起。我不确定第二个。

2 个答案:

答案 0 :(得分:1)

第一个选择1000个记录然后聚合。

第二个聚合所有数据,然后从结果集中选择1000个记录。

哪个准确?这取决于你想做什么。哪个更快?可能是第一个,因为它在聚合之前过滤数据。

答案 1 :(得分:1)

想象一下,你有一个国家居民的数据库,他们的城镇和年薪。你按城镇分组,然后一起加薪。

第一个查询选择1000个随机居民 - 他们可能都住在一个城镇,或者他们可能来自五个,十个或三十个城镇。然后你按城镇分组并总结他们的工资。一些城镇将不包括在结果集中;而对于那些城镇来说,你可以得到一些&#34;一些&#34; (随机)该镇的居民。在大多数情况下,这种查询是无用的。

第二个查询按城镇分组居民,并计算每个城镇的工资总额。然后外部查询从该国家/地区中选择1000个随机城镇。 (好吧,这是一个非常大的国家,有超过1000个城镇。)这个查询更有帮助 - 虽然您选择1000 随机城镇的事实使它仍然有点无用。

显然,第一个查询应该快得多,因为它只能看1000名居民,而不是1.2亿居民。但这种比较完全无关紧要,因为这两个查询的确非常相似。