将rownum()从db2转换为Oracle

时间:2013-10-01 03:35:47

标签: sql oracle db2 rownum

美好的一天,

我想更改一些程序代码(主要是SQL代码),因为数据库已经从DB2更改为Oracle。

以下是我成功改变的一个例子,但我对此并不是很了解,而且我无法从谷歌中找到它。

以下是原始SQL查询代码(使用DB2):

SELECT * 
FROM (SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum 
FROM IBSADMIN.CCGROUP T0 
WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC') AS tname
WHERE rownum BETWEEN 1 AND 20

以下是我编辑后的SQL查询代码(从Oracle成功获取数据):

SELECT * 
FROM (SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum1 
FROM IBSADMIN.CCGROUP T0 
WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC') tname
WHERE rownum1 BETWEEN 1 AND 20

正如我分析的那样,如果我没有将rownum更改为rownum1,则会收到错误,错误为ORA-00923: FROM keyword not found where expected。因此我将其更改为rownum1,我认为{ {1}}应该是DB2中的关键字,对于Oracle也有这样的关键字吗?

在第4行的最后一部分中,从DB2代码开始,以rownum结束。如果我在Oracle代码中添加相同的内容,则会收到错误As tname。因此我删除了ORA-00933: SQL command not properly ended。我不太明白As是什么意思,作为括号中的SQL查询:

As tname

它返回2列,因此我不明白(SELECT T0.CREATEDBY AS C1, row_number() OVER ( ORDER BY T0.GROUPNAME) AS rownum1 FROM IBSADMIN.CCGROUP T0 WHERE T0.GROUPID != 0001 AND T0.GROUPID != 001 AND T0.CHANNEL = 'CC') 如何与2列进行交互。

请告知。

2 个答案:

答案 0 :(得分:2)

  1. rownum是Oracle中的保留字 - 在Oracle中,rownum是一个伪列,您可以引用它来获取结果集的行号(在排序之前)。这就是您在转换为Oracle时需要更改别名的原因。我希望与rownum - rnrnk明显不同的东西是不错的选择。

  2. tname是查询中内联视图的别名。在Oracle中,您不能使用AS关键字来分配表别名(您可以选择在定义列别名时使用它,这就是AS rownum1有效的原因,但您也可以删除{{1完全)。在这种情况下,AS别名从未使用过,所以在Oracle中你可以省略它。我知道在一些数据库(SQL Server)中需要内联视图的别名 - 我不确定DB2是否需要表别名。

  3. 听起来你正确地修改了查询(虽然我用你选择的别名而不是tname狡辩)。

答案 1 :(得分:0)

可能没人会对此感兴趣,但我在这里找到了这个解决方案:

http://www.sqlines.com/db2-to-oracle/fetch_first_rows_only

使用FETCH FIRST x ROWS ONLY,例如:

select * from a_table  FETCH FIRST 1 ROWS ONLY;

只会给你表格的第​​一行,我已经使用了它,它就像我预期的那样工作。