gpt4 book ai didi

mysql - 将 MySQL 脚本转换为 ORACLE

转载 作者:行者123 更新时间:2023-11-30 23:15:21 37 4
gpt4 key购买 nike

我正在尝试将上述脚本从 MySQL 转换为 ORACLE,我完全是使用 ORACLE 数据库和 PL/SQL 的初学者。我读到MYSQL中的IFNULL相当于ORACLE中的NVL,但我仍然无法转换beyond脚本。请帮忙。

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;

提前致谢。

最佳答案

这是我想出的(尚未测试)

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;

一些注意事项:

我认为您不能在 HAVING 子句中引用分配给表达式的别名。 (这可能已经改变,现在在更新的 Oracle 版本中被允许,但是在 HAVING 子句中,我们不得不重复这个表达式。

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

我们总是可以通过 SELECT 列表中的列位置进行引用。

我不确定我们是否可以在 ROW_NUMBER() OVER() 中的 ORDER BY 子句中引用列别名。上面的查询就是这样做的,但重复该表达式将是解决方法。

使用表别名限定所有列引用是一种很好的做法。

我们不能在一个表中有两列同名 (Id),因此至少其中一列需要分配不同的名称,最好在我们的查询(我们避免 Oracle 抛出错误,或生成分配的名称。)

在上面的查询中,COALESCE 函数执行与 NVL() 或 CASE 表达式相同的职责。 (我相信 COALESCE 是更便携且与 SQL-92 兼容的选项。)

我认为 COUNT 是一个关键字,用表别名 (i.COUNT) 对其进行限定使其明确无误。

关于mysql - 将 MySQL 脚本转换为 ORACLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18127892/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com