0

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

SELECT * FROM (SELECT col1, col2, col3, ROW_NUMBER() OVER () AS RN FROM table) AS cols WHERE RN BETWEEN 1 AND 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 <1000

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

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

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

任何帮助都会受到赞赏,即使它伴随着一些建设性的批评。

4

2 回答 2

1

你的表表达式:

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

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

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

于 2010-08-06T00:13:58.367 回答
0

我不使用 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
于 2010-08-05T21:26:10.273 回答