我有在甲骨文的SQL语句的大问题。我想选择的TOP 10条下令STORAGE_DB这不是从其他select语句列表。

这一个正常工作的所有记录:

SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
      STORAGE_GB IS NOT NULL AND 
        APP_ID NOT IN (SELECT APP_ID
                       FROM HISTORY
                        WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') 

但是,当我加入

AND ROWNUM <= 10
ORDER BY STORAGE_GB DESC

我得到了某种“随机”记录。我想是因为限订单之前发生在地方。

是否有人有一个很好的解决方案?另一个问题:该查询是真的慢(10K +记录)

有帮助吗?

解决方案

您将需要把你的当前查询的子查询,如下:

SELECT * FROM (
  SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
    STORAGE_GB IS NOT NULL AND 
      APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
  ORDER BY STORAGE_GB DESC )
WHERE ROWNUM <= 10

甲骨文适用 ROWNUM 以所述结果已经返回后它。点击你需要过滤结果已经返回后,因此需要一个子查询。您也可以使用 RANK()函数为了获得高端-N结果。 搜索结果 出于性能方面的尝试在地方NOT EXISTS使用NOT IN。见了解。

其他提示

如果使用的是Oracle 12c中,使用:

  

FETCH NEXT的 Ñ ROWS ONLY

SELECT DISTINCT 
  APP_ID, 
  NAME, 
  STORAGE_GB, 
  HISTORY_CREATED, 
  TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE  
  FROM HISTORY WHERE 
    STORAGE_GB IS NOT NULL AND 
      APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009')
  ORDER BY STORAGE_GB DESC
FETCH NEXT 10 ROWS ONLY

更多信息: http://docs.oracle.com/javadb /10.5.3.0/ref/rrefsqljoffsetfetch.html

至于表现不佳有任何数量的事情可能是,它真的应该是一个单独的问题。然而,存在可能是一个问题的一种显而易见的事:

WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') 

如果HISTORY_DATE真的是一个日期栏,如果它有一个索引然后这个重写将执行更好:

WHERE HISTORY_DATE = TO_DATE ('06.02.2009', 'DD.MM.YYYY')  

这是因为一个数据类型转换禁止使用B树索引的。

SELECT * FROM users FETCH NEXT 10 ROWS ONLY;

您因为ORDER BY之前应用ROWNUM得到一个明显的随机集。所以,你的查询需要前十行和排序them.0要选择前十的工资,你应该在子查询中使用的解析函数,然后过滤器:

 select * from 
     (select empno,
             ename,
             sal,
             row_number() over(order by sal desc nulls last) rnm
    from emp) 
 where rnm<=10
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top