首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将MySQL脚本转换为ORACLE

将MySQL脚本转换为ORACLE
EN

Stack Overflow用户
提问于 2013-08-08 13:53:29
回答 2查看 1.1K关注 0票数 1

我正在尝试将上面的脚本从MySQL转换为ORACLE,我完全是使用和PL/SQL的初学者。我读到MYSQL中的IFNULL与ORACLE中的NVL相当,但我仍然不能转换but脚本。请帮帮忙。

代码语言:javascript
复制
SET @r:=0;

CREATE TABLE COUNTRY_MONDIAL AS 
SELECT @r:=@r+1 RowN, @Dtf0:=Dtf0 Dtf0, @Dtf1:=Dtf1 Dtf1, 
IFNULL((log(log(@Dtf0)+1)+1),0)*9.531408863445597 + 
IFNULL((log(log(@Dtf1)+1)+1),0)*9.531408863445696 Score, Id,ID_CITY, Id, dl 
FROM (SELECT PKey, MAX(CASE WHEN WordId=205 THEN Count ELSE 0 END) AS Dtf0, 
MAX(CASE WHEN WordId=223 THEN Count ELSE 0 END) AS Dtf1 
FROM COUNTRY_I WHERE WordId in (205,223) 
GROUP BY PKey HAVING Dtf0>0 OR Dtf1>0) Cnt, COUNTRY T1 
WHERE Cnt.PKey = Id
ORDER BY Score DESC;

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-08 17:36:46

这是我想出来的(这还没有测试)

代码语言:javascript
复制
CREATE TABLE COUNTRY_MONDIAL 
AS 
SELECT ROW_NUMBER() OVER (ORDER BY t.Score DESC) AS RowN
     , c.Dtf0
     , c.Dtf1
     , COALESCE((LOG(LOG(c.Dtf0)+1)+1),0)*9.531408863445597 
       + COALESCE((LOG(LOG(c.Dtf1)+1)+1), 0)*9.531408863445696 AS Score
     , t.Id
     , t.ID_CITY
     , t.Id AS Id2
     , t.dl
  FROM ( SELECT i.PKey
              , MAX(CASE WHEN i.WordId=205 THEN i.COUNT ELSE 0 END) AS Dtf0
              , MAX(CASE WHEN i.WordId=223 THEN i.COUNT ELSE 0 END) AS Dtf1
           FROM COUNTRY_I i
          WHERE i.WordId IN (205,223)
          GROUP
             BY i.PKey
         HAVING 0 < MAX(CASE WHEN i.WordId=205 THEN i.COUNT ELSE 0 END)
             OR 0 < MAX(CASE WHEN i.WordId=223 THEN i.COUNT ELSE 0 END)
       ) c
  JOIN COUNTRY t
    ON t.Id = c.PKey
 ORDER
    BY t.Score DESC;

一些注释:

我不相信你能引用一个别名分配给一个表达式在一个有子句。(这可能已经改变了,现在允许在Oracle的最新版本中使用,但是在HAVING子句中,我们不得不重复这个表达式。

别名可以在ORDER子句中引用( UNION/UNION ALL查询除外);我们

我们总是可以在选择列表中按列引用。

我不确定是否可以在ROW_NUMBER() OVER()子句中引用列别名。上面的查询可以做到这一点,但是重复这个表达式将是解决办法。

使用表别名对所有列引用进行限定是一种良好做法。

表中不能有两个名称相同的列(Id),因此至少需要为其中一个列分配一个不同的名称,最好在查询中指定它(我们避免引发错误,或者生成指定的名称)。

在上面的查询中,合并函数执行与NVL()或CASE表达式相同的职责。(我认为合并是更可移植和与SQL-92兼容的选项。)

我认为COUNT是一个关键字,使用一个表别名(i.COUNT)对其进行限定,使它变得清晰。

票数 0
EN

Stack Overflow用户

发布于 2013-08-08 17:09:29

在我看来,变量@r被用来创建一个序列号,在Oracle中,它可以被序列替换。尝试以下几点:

代码语言:javascript
复制
CREATE SEQUENCE COUNTRY_MONDIAL_SEQ
  MINVALUE 1
  NOMAXVALUE 
  NOCACHE;

CREATE TABLE COUNTRY_MONDIAL AS
  SELECT COUNTRY_MONDAIL_SEQ.NEXTVAL AS ROWN,
         cnt.DTF0,
         cnt.DTF1,
         NVL(LOG(LOG(cnt.DTF0)+1)+1, 0) * 9.531408863445597 +
           NVL(LOG(LOG(cnt.DTF1)+1)+1, 0) *9 .531408863445696 AS SCORE,
         t1.ID,
         t1.ID_CITY,
         t1.ID,
         t1.DL
    FROM (SELECT PKEY,
                 MAX(CASE WHEN WORDID = 205 THEN COUNT ELSE 0 END) AS DTF0,
                 MAX(CASE WHEN WORDID = 223 THEN COUNT ELSE 0 END) AS DTF1,
            FROM COUNTRY_I
            WHERE WORDID IN (205, 223)
            GROUP BY PKEY
            HAVING DTF0 > 0 OR
                   DTF1 > 0) cnt
     INNER JOIN COUNTRY t1
       ON (t1.ID = cnt.PKEY)
     ORDER BY SCORE DESC;

分享并享受。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18127892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档