Sql DB2中的行数()

Sql DB2中的行数(),sql,db2,Sql,Db2,如何在DB2数据库的where子句中使用ROW_NUMBER。 我尝试了以下方法,但无效: SELECT * FROM CSPAPP.LOCATIONS WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200 它给出了错误:聚合函数或OLAP函数的使用无效 我还尝试了以下方法: SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCAT

如何在DB2数据库的where子句中使用ROW_NUMBER。 我尝试了以下方法,但无效:

SELECT * FROM CSPAPP.LOCATIONS
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200
它给出了错误:聚合函数或OLAP函数的使用无效

我还尝试了以下方法:

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCATIONS
WHERE RN < 200

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,LOCATION FROM CSPAPP.LOCATIONS
WHERE RN < 200

不能在定义别名的同一级别上引用别名。您需要将其包装到派生表中:

SELECT location
FROM (
   SELECT row_number() over(order by location) as rn, 
          location 
   FROM cspapp.locations
)   
WHERE rn < 200
SELECT T1.* FROM(
       SELECT row_number() over(order by location) as rn ,L.* 
       FROM cspapp.locations L) As T1 
WHERE T1.rn < 200

在iSeries DB2中基于行数进行选择时,我会使用如下方法:

SELECT *
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
    FROM CSPAPP.LOCATIONS
    )
WHERE RRN between 100 and 200
如果您只对1字段感兴趣,您可以为该字段指定一个名称,然后选择并引用字段:

SELECT DATA.location
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, *
    FROM CSPAPP.LOCATIONS
    ) as DATA
WHERE DATA.RRN between 100 and 200

可以在定义别名的同一级别上引用别名。您需要将其包装到派生表中:

SELECT location
FROM (
   SELECT row_number() over(order by location) as rn, 
          location 
   FROM cspapp.locations
)   
WHERE rn < 200
SELECT T1.* FROM(
       SELECT row_number() over(order by location) as rn ,L.* 
       FROM cspapp.locations L) As T1 
WHERE T1.rn < 200

但你应该明白,这永远都不是最好的做法。您应该使用列名而不是*L.col1。

您可以尝试仅获取前200行,而不是行号。写下您的选择,就像您通常没有行_编号一样,按您需要的顺序排序,然后取第一个x


使用*选择所有列不是一种好的做法,尤其是如果您有600多列,而这本身就是数据库的糟糕设计。

不使用行数函数:

SELECT * FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATION FETCH FIRST 200 rows only)
ORDER BY LOCATION DESC FETCH FIRST 100 rows only;

With Row number:

SELECT ROW_NUMBER() OVER(ORDER BY LOCATIONS), LOCATIONS as RNM FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATIONS FETCH FIRST 200 rows only)
ORDER BY LOCATIONS DESC FETCH FIRST 100 rows only;

非常感谢您的解决方案,但它部分地满足了我的需要。我正在尝试从以下位置选择*:选择按位置超额订购的行号为rn,*从rn<200但不起作用的cspapp.locations。您能建议吗?对不起。错误为:按位置为rn的“”找到意外令牌*。预期令牌可能包括:。我不能输入每一列,因为表中大约有600列。所以我必须使用*一次性选择所有列。可能位置在DB2中是一个保留字,我不知道。我认为select column_name,*from table_name在DB2中是不允许的,这在SQL Server中是允许的。有什么想法吗???然后加上前缀*:选择行号,table_name.*从table_name或使用别名感谢您的帮助。我尝试了以下方法:从cspapp.locations中选择*位置从SELECT row_中选择位置编号按位置超额订购为rno,从cspapp.locations中选择位置rno介于1000和10000之间。效果很好。