提取没有oF行可以被选择查询返回

时间:2018-10-01 10:08:34

标签: sql postgresql jdbc

我正在尝试获取数据并以分页的形式显示在表中。因此,我为此使用了限制和偏移量,但是我也需要不显示可以从该查询中获取的行。有没有办法做到这一点。 我尝试过

resultset.last() and getRow()
select count(*) from(query) myNewTable;

这两种情况我得到正确的答案,但这是正确的方法吗?性能是一个问题

2 个答案:

答案 0 :(得分:0)

我们可以使用以下代码获取有限的记录,

首先,我们需要在下方设置所需的记录数量

var limit = 10;

之后,此限制发送到以下语句

WITH
    Temp AS(
        SELECT
            ROW_NUMBER() OVER( primayKey DESC ) AS RowNumber,
            *
        FROM
            myNewTable
    ),
    Temp2 AS(
        SELECT COUNT(*) AS TotalCount FROM Temp
    )
SELECT TOP limit * FROM Temp, Temp2 WHERE RowNumber > :offset order by RowNumber

这同时在MSSQL和MySQL中运行

答案 1 :(得分:0)

没有简单的方法可以做到这一点。

1。。您发现,通常可以归结为执行两个查询:

执行具有限制和偏移量的SELECT以便获取所需的数据。

执行COUNT(*)以便计算总页数。

此方法可能适用于行数不多的表,或者在索引的列上过滤数据(对COUNTSELECT查询进行数据过滤时)。

2。。如果表很大,但是您需要显示的数据只占表中数据的百分比 ,并且该数据具有共同的特征(例如,您所有页面中的数据都是在一天之内创建的),您可以使用partitioning。在单个分区上执行COUNTSELECT比在整个表上执行它们要快得多。

3。。您可以创建另一个表,该表将存储COUNT查询的值。 例如,假设您的 big_table 表如下所示:

id | user_id | timestamp_column | text_column | another_text_column

现在,您的SELECT查询看起来像这样:

SELECT * FROM big_table WHERE user_id = 4 ORDER BY timestamp_column LIMIT 20 OFFSET 20;

您的计数查询:

SELECT COUNT(*) FROM table WHERE user_id = 4;

您可以创建一个具有以下格式的 count_table

user_id | count

使用系统中的当前数据填充此表后,您将创建一个触发器,该触发器将在 big_table 的每次插入或更新时更新此表。

这样,计数查询将非常快,因为它将在 count_table 上执行,例如:

SELECT count FROM count_table WHERE user_id = 4

此方法的缺点是 big_table 中的插入会变慢,因为触发器会在每次插入时触发并更新 count_table

这是您可以尝试的方法,但最终,这完全取决于数据的大小和类型。