【问题标题】:T-SQL to PL/SQL - Use temporary variables and the "INTO" expression to search the total of a query in Oracle DBT-SQL 到 PL/SQL - 使用临时变量和“INTO”表达式在 Oracle DB 中搜索查询的总数
【发布时间】:2019-12-16 23:26:40
【问题描述】:

在下面的 sql 中,我返回表之间的搜索,然后返回已经分页的总数。

返回这个总数的需要是分页

该查询正在使用 sql server。

Sql 服务器:

  SELECT
        bu.Id as 'BarcoUsuarioId',
        Barco_Id as 'BarcoId',
        bu.Usuario_Id as 'UsuarioId',
        barco.Nome as 'NomeBarco'
  into #tmpBarcoUsuario
  FROM BARCO_USUARIO AS bu
  inner join BARCO as barco on barco.Id = bu.Barco_Id
  where bu.Usuario_Id = @usuarioId

  declare @totalEmbarcacoes as int = (select count(*) from #tmpBarcoUsuario);
  select
        BarcoUsuarioId,
        BarcoId,
        UsuarioId,
        NomeBarco, 
   @totalEmbarcacoes as TotalEmbarcacoes from #tmpBarcoUsuario
   order by BarcoId
   OFFSET @pageSize *(@pageNumber - 1) ROWS
   fetch next @pageSize ROWS ONLY";

但是,在使用 Oracle 数据库时,我遇到了一些困难。

从下面的sql可以看出,我已经在oracle DB中进行了分页查询:

甲骨文:

SELECT  *                           
              FROM(
              SELECT ROWNUM rnum, b.* 
              FROM (
              SELECT 
                   barcoUser.ID BarcoUsuarioId  ,
                   barcoUser.BARCO_ID BarcoId  ,
                   barcoUser.USARIO_ID UsuarioId  ,
                   barco.NOME NomeBarco 
              FROM BARCO_USUARIO barcoUser INNER JOIN EMBARCACAO barco ON barco.ID = barcoUser.BARCO_ID
              WHERE (barcoUser.USARIO_ID=:usuarioId)ORDER BY BarcoId DESC
               )b 
              )WHERE RNUM between :PageSize * (:PageNumber - 1) AND  (:PageSize * :PageNumber)";

但是我将如何返回所有这些已经分页的总数,就像在 sql server 中所做的那样?

【问题讨论】:

  • 也许count 像这样:count(1) over() as TotalEmbarcacoes?
  • Oracle (12c+) 确实支持 OFFSET .. ROWS FETCH NEXT .. ROWS ONLY 语法,顺便说一句。

标签: oracle tsql


【解决方案1】:

可以使用解析count(*)函数

        SELECT  *                           
          FROM(
          SELECT ROWNUM rnum, b.* 
          FROM (
          SELECT 
               barcoUser.ID BarcoUsuarioId  ,
               barcoUser.BARCO_ID BarcoId  ,
               barcoUser.USARIO_ID UsuarioId  ,
               barco.NOME NomeBarco ,
               count(*) over () TotalCount
          FROM BARCO_USUARIO barcoUser 
               INNER JOIN EMBARCACAO barco ON barco.ID = barcoUser.BARCO_ID
         WHERE (barcoUser.USARIO_ID=:usuarioId)
         ORDER BY BarcoId DESC
           )b 
          )
       WHERE RNUM between :PageSize * (:PageNumber - 1) 
                    AND  (:PageSize * :PageNumber)

请注意,如果您希望最大限度地减少数据库引擎之间的更改,Oracle 从 12c 开始就支持 OFFSET FETCH 语法。但是,rownum 方法可能比 OFFSET FETCH 方法更快。

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2017-03-18
    • 2017-06-03
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多