【问题标题】:Convert rownum() from db2 to Oracle将 rownum() 从 db2 转换为 Oracle
【发布时间】:2013-10-07 02:24:33
【问题描述】:

早安,

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

这是我成功更改的 1 个示例,但我不太了解它,我无法从 google 找到它。

以下是原始 SQL Query 代码(使用 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,我认为rownum 应该是DB2 中的关键字,Oracle也有这样的关键字吗?

在第 4 行的最后一部分,来自 DB2 代码,它以 As tname 结尾。如果我将相同的内容放入 Oracle 代码中,则会收到错误 ORA-00933: SQL command not properly ended 。因此我删除了 As 。我不太明白As tname是什么意思,如括号中的SQL查询:

(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 列,因此我不明白 As tname 如何与 2 列交互。

请多多指教。

【问题讨论】:

    标签: sql oracle db2 rownum


    【解决方案1】:

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

    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;
    

    只会给你表格的第​​一行,我用过它,它的工作方式和我预期的一样。

    【讨论】:

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

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

      听起来您正确地修改了查询(尽管我对您选择的别名而不是 rownum 提出质疑)。

      【讨论】:

      • 嗨贾斯汀。感谢您在第一段中的解释。你的意思是我把rownum改成rownum1不太合适,你建议把它改成更多不同的词,比如rnrnk。你是这个意思吗?还是其他的?
      • @PanadolChong - 是的,这正是我的意思。
      • 我的问题中的 DB2 SQL 查询是否意外使用了 rownumrownum 实际上是 Oracle 中的关键字?如果我在 DB2 中使用 rownumber 而不是 rownum 没有任何问题,对吧?还是rownum实际上也是DB2中的关键字?
      • @PanadolChong - 'rownumber` 不是 DB2 中的关键字。因此,您可以在两个数据库中使用 rownumberrnrnk 作为您的别名,并使您的查询具有合理的可读性。
      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2011-02-07
      • 2021-10-24
      相关资源
      最近更新 更多