我对Oracle中的SQL语句有一个大问题.我想从另一个select语句中 Select 由STORAGE_DB排序的前10条记录,它们不在列表中.

这一条适用于所有记录:

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

返回结果后,Oracle对其应用rownum
返回结果后需要对其进行过滤,因此需要子查询.您还可以使用RANK()函数获得前N个结果.

Sql相关问答推荐

如何连接第二个表并将其内容输入到第一个表的单个字段中?

SQL—如何根据2列填写缺失的值

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

我怎样才能得到列值对应的最大值在另一个?

按分类标准检索记录

在SQL GROUP BY中的某些行之后执行计算

在PostgreSQL中汇总连接表中的 case 值

使用CTE在SNOWFLAKE中创建临时表

在 Postgres 中将结果按几十年划分

按二维数组的第一个元素排序

聚合内部的条件在哪里?

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

在 SQL Server 中合并两个 XML 列

AdventureWorks 查询

计算 BigQuery 中列的中值差 - 分析函数不能作为聚合函数的参数

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

正则表达式:停在第一个匹配的其中一个字符位置上

获取 SQL Server 中每一行的两个-之间的文本

将有效数字作为 varchar 返回的 SQL 函数

如何根据 ID 和指标从 2 个表中找到不同的值?