【问题标题】:Perl prepare DB2 statement not returning what I needPerl 准备 DB2 语句不返回我需要的内容
【发布时间】:2010-08-05 21:19:03
【问题描述】:

由于我使用的是 DB2,为了在中间选择数据库的一部分(如限制/偏移配对),我需要执行不同类型的准备语句。给我的例子是这样的:

选择 * FROM (SELECT col1, col2, col3, ROW_NUMBER() OVER () AS RN FROM table) AS cols 其中 RN 介于 1 和 10000 之间;

我适应了这个:

SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY 2,3,4,6,7 ASC) AS rownum FROM TRANSACTIONS) AS foo WHERE rownum >= 500 AND rownum

当我调用 fetchall_arrayref() 时,我确实得到了我想要的 500 个结果,但它只返回一个包含行号引用的数组,而不是我想要提取的所有数据。我知道这就是代码在编写时应该做的事情,并且我尝试了一堆排列来获得我想要的结果,但没有运气。

我想要的只是像我之前的准备语句一样将所有列抓取到一个数组数组中: SELECT * FROM TU_TRANSACTIONS ORDER BY 2, 3, 4, 6, 7

但只是在指定的部分。我只是缺少一个基本的东西,我只是看不到它。

感谢任何帮助,即使它伴随着一些建设性的批评。

【问题讨论】:

  • 你试过用 RRN(相对记录号)代替 row_number 吗? SELECT T.*, RRN(T) FROM TU_TRANSACTIONS T WHERE RRN(T) BETWEEN 500 and 1000 ORDER BY 2,3,4,6,7

标签: perl db2 prepare


【解决方案1】:

你的表格表达式:

(SELECT ROW_NUMBER() OVER (ORDER BY 2,3,4,6,7 ASC) AS rownum FROM TRANSACTIONS) as foo

只有一列 - rownum - 所以当你从“foo”中选择“*”时,你只会得到一列。

您的表格表达式需要包含您想要的所有列,就像您发布的示例一样。

【讨论】:

    【解决方案2】:

    我不使用 DB2,所以我可能会偏离基础,但似乎:

    SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY 2,3,4,6,7 ASC) AS rownum FROM TRANSACTIONS) AS foo WHERE rownum >= 500 AND rownum <1000
    

    只返回行号,因为子查询引用表,而主查询不引用。看起来它所看到的只是一组数字(它将返回一个填充了数字的列)

    也许这会起作用:

    SELECT * FROM TRANSACTIONS, (SELECT ROW_NUMBER() OVER (ORDER BY 2,3,4,6,7 ASC) AS rownum FROM TRANSACTIONS) AS foo WHERE rownum >= 500 AND rownum <1000
    

    【讨论】:

    • 理论上这是个好主意,但我遇到了内存不足错误,因为我相当确定移动事务表会从事务中提取所有信息(它本身, 是一个超过 1,000,000 行的数据库),以及额外的列。老实说,它对我来说看起来不错,我试过了,但没有运气:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2014-08-04
    相关资源
    最近更新 更多