我正在尝试将上面的脚本从MySQL转换为ORACLE,我完全是使用和PL/SQL的初学者。我读到MYSQL中的IFNULL与ORACLE中的NVL相当,但我仍然不能转换but脚本。请帮帮忙。
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;提前谢谢。
发布于 2013-08-08 17:36:46
这是我想出来的(这还没有测试)
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)对其进行限定,使它变得清晰。
发布于 2013-08-08 17:09:29
在我看来,变量@r被用来创建一个序列号,在Oracle中,它可以被序列替换。尝试以下几点:
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;分享并享受。
https://stackoverflow.com/questions/18127892
复制相似问题