在oracle

时间:2017-03-07 10:45:32

标签: java oracle jdbc pagination row-number

以下是从DB获取结果的查询,并且有一个方案无法通过以下查询来获取数据库中的结果数。

SELECT outer.*
FROM
(SELECT middle.*
FROM
(SELECT inner.*,
  ROW_NUMBER() OVER(PARTITION BY 2 ORDER BY 2 DESC) AS RN,
  COUNT(2) OVER()                                   AS COUNT
FROM
  (SELECT account.account_id,
    account.account_no
  FROM X account
  WHERE 1=1
  AND account.account_id NOT IN
    (SELECT account_tnx.account_id
    FROM A account_tnx
    WHERE account_tnx.tnx_stat_code IN (? ,? ,?,?,?,?)
    )
  AND ( account.product_type LIKE '%'  --'%IN'
  AND account.company_id= 10 )
  UNION
  SELECT account.account_id,
    account.account_no
  FROM A account
  LEFT JOIN U maker_user
  ON account.maker_id        = maker_user.user_id
  WHERE 1                    =1
  AND account.tnx_stat_code IN (?,?,?,?,?,?)
  AND ( account.product_type LIKE '%'   --'%IN'
  AND account.company_id= 10 )
  ) INNER
) middle
WHERE RN <= ? --(EndIndex)
) OUTER
WHERE outer.RN > ? --(StartIndex)

A,X,U是DB

中的表格

案例:有一个屏幕,其中包含每页记录的搜索表单(10/25/50/100)默认为每页50条记录。 如果我转到页面默认值是50我会将起始索引发送为0并将结束索引作为50发送到java,它将设置开始和结束索引,以下是我正在使用搜索1和搜索2的情景

搜索1: - 交易类型: - 本地转移&amp;状态:新

(从总记录184中成功检索DB中前50个结果中的2个记录,这将使我的搜索与结束索引匹配为50)。 请参考image1进行此搜索

搜索2: - 交易类型: - *(通配符)&amp;状态:新

(使用外卡时未找到任何记录(oracle like&#39;%&#39;)表示仅从184条记录中检索DB中的前50条记录(因为我发送的结束索引为50)通过搜索因为51到184记录有我的2条记录) 请参考image2进行此搜索

查询失败没有问题只需要获得所需的记录而不影响性能

我的问题是在使用通配符时,与查询中的事务类型过滤相比,它将检索更多记录,这样我无法使用通配符搜索检索记录如何使其成功从db获取所需的记录< / p>

我正在使用java jdbc

PrepareStatement  st = con.prepareStatement(query,ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);

我正在使用性能相关问题的开始和结束索引

请提供建议,以便在不影响我现有检索性能的情况下获取包含以下查询更改的记录

请提供一些其他选项来改善我的以下查询性能,而无需索引就能达到相同的性能

Search 1

Search 2

0 个答案:

没有答案