【问题标题】:How to avoid this nested query [duplicate]如何避免这种嵌套查询[重复]
【发布时间】:2020-05-22 03:23:08
【问题描述】:

我有一个category 表,需要对其进行分页。我正在使用 JSF,并在 XML 中查询。有什么方法可以更好地优化这个查询。

SELECT
    *
FROM
    (
        SELECT
            categories.*,
            ROWNUM rn
        FROM
            (
                SELECT
                    *
                FROM
                    (
                        SELECT
                            *
                        FROM
                           categories
                        WHERE
                          name LIKE 'FAMILY%'
                        ORDER BY
                            id
                    )
                WHERE
                    ROWNUM < 21
            ) categories
    )
WHERE
    rn > 10;

【问题讨论】:

  • 您使用的是哪个版本的 Oracle

标签: sql oracle


【解决方案1】:

在数据库版本 12 上,有可用的偏移和获取功能,因此您的查询可能如下所示

SELECT *
  FROM categories
 WHERE name LIKE 'FAMILY%'
 ORDER BY id
OFFSET 10 rows -- skips first 10 rows of the result
 FETCH 11 rows only;

请试试那个

可以使用以下查询检查数据库版本

select * from v$version;

【讨论】:

  • 从 oracle 12c 及更高版本开始支持
  • @Tejash 该死的你是对的。更新了答案。谢谢!
  • 令我惊讶的是,Oracle 等到 12c 才提供基本的 OFFSET/LIMIT 功能。
【解决方案2】:

您是否正在寻找这样的查询?

SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY id) ROWNUM,* FROM categories
WHERE name LIKE 'FAMILY%') as categories where ROWNUM between 10 and 21

【讨论】:

  • 这对我有用,但如果我从 2 到 20 个空数据开始填充,则只填充 1 到 10+ 个数据。 ROWNUM 有什么问题吗?
  • 由于以下几个原因,该查询在 Oracle 中无法编译:ROWNUM 是伪列,您不能将其用作别名;在表/子查询别名在语法上无效之前使用AS;当您还选择其他列时,您需要在 * 前面加上表名/别名。
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 2020-04-01
  • 2020-11-23
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
相关资源
最近更新 更多