【问题标题】:Is there a query to retrieve data from Sybase table on record count condition是否有查询以根据记录计数条件从 Sybase 表中检索数据
【发布时间】:2019-08-23 13:10:25
【问题描述】:

我有一种情况,我需要根据某个条件从 Sybase 表中选择记录

  1. 需要按批次提取记录。如果总计数为 2000,那么我需要在第一批中提取 500 个,在下一批中提取 500 个,直到达到 2000 条记录数。
  2. 我使用了限制条件,但它给出的语法不正确
select top 2 * 
from CERD_CORPORATE..BOOK 
where id_bo_book in('5330') 
limit(2,3)

【问题讨论】:

  • 您在 CERD_CORPORATE..BOOK 中有错字,是吗?
  • ASE 的哪个版本?对 limit/offset 的支持直到 ASE 16.x 才出现
  • 如果不是 16.x,那么我还有其他方法可以完成这项任务。该表可能有 20k 条记录,并且可能需要在每个 select 语句中提取 1500 条记录

标签: python sap-ase


【解决方案1】:

LIMIT 条件不能使用范围,但可以为此使用 OFFSET 关键字:

SELECT top 2 * FROM CERD_CORPORATE.BOOK 
WHERE id_bo_book in('5330') 
LIMIT 2 OFFSET 1;

【讨论】:

  • 谢谢,但没有运气。仍然在限制附近说不正确的语法
【解决方案2】:

在 ASE 12.5.1 及更高版本上,这可以通过“SQL 派生表”或“内联视图”来完成。该查询要求每一行都有一个唯一的键,以便表可以与其自身连接,并且可以返回键值小于正在连接的行的行数。这给出了一个单调递增的数字,用于指定限制和偏移量。

limit 和 offset 的等价物是与 x.rowcounter 比较的值。

select
        x.rowcounter,
        x.error,
        x.severity
    from
        (
            select
                    t1.error,
                    t1.severity,
                    t1.description,
                    count(t2.error) as rowcounter
                from
                    master..sysmessages t1,
                    master..sysmessages t2
                where
                    t1.error >= t2.error
                group by
                    t1.error,
                    t1.severity,
                    t1.description
        ) x
    where
        x.rowcounter >= 50
    and x.rowcounter < 100

SQL 派生表可追溯到 Sybase ASE 12.5.1,SQL Derived Tables

示例中使用 master..sysmessages 提供了一个合理的(10,000 行)数据集,可用于试验。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多