美好的一天,
我想更改一些程序代码(主要是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列进行交互。
请告知。
答案 0 :(得分:2)
rownum
是Oracle中的保留字 - 在Oracle中,rownum
是一个伪列,您可以引用它来获取结果集的行号(在排序之前)。这就是您在转换为Oracle时需要更改别名的原因。我希望与rownum
- rn
或rnk
明显不同的东西是不错的选择。
tname
是查询中内联视图的别名。在Oracle中,您不能使用AS
关键字来分配表别名(您可以选择在定义列别名时使用它,这就是AS rownum1
有效的原因,但您也可以删除{{1完全)。在这种情况下,AS
别名从未使用过,所以在Oracle中你可以省略它。我知道在一些数据库(SQL Server)中需要内联视图的别名 - 我不确定DB2是否需要表别名。
听起来你正确地修改了查询(虽然我用你选择的别名而不是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;
只会给你表格的第一行,我已经使用了它,它就像我预期的那样工作。