以下查询在 MySQL 中运行良好:
SELECT
total,
status.nome
FROM status
INNER JOIN (SELECT count(*) AS total,
status_id
FROM [log]
WHERE evento_id = '21'
AND data BETWEEN '02/09/2013 00:00:00' AND '02/09/2013 23:59:59'
GROUP BY status_id) AS groupedTable
ON groupedTable.status_id = status.id;
但是当我尝试在 Oracle 中运行它时,我收到以下错误消息:
ORA-00903: invalid table name
如果我将查询更改为:
SELECT
total, status.nome
FROM
status
INNER JOIN (
SELECT count(*) as total, status_id
FROM log
WHERE evento_id = '21'
AND data BETWEEN '02/09/2013 00:00:00' AND '02/09/2013 23:59:59'
GROUP BY status_id) AS groupedTable
ON groupedTable.status_id = status.id;
我收到此错误消息:
ORA-00905: keyword not found
我认为问题出在 log
表中,但我无法转换它并使其在 Oracle 中工作。有人可以帮我吗?
最佳答案
首先,您从 [log]
表中删除方括号是正确的。方括号不是有效的分隔符,也不是表名称的有效字符。
其次,Oracle 不喜欢 SELECT ... FROM myTable AS myAlias
中的 AS
。它允许使用 AS
作为列别名,但不允许使用表别名,因此请将 As
删除到 As groupedTable
中。
第三,您的日期格式可能无效。如果不是,它仍然是一个潜在的故障点。甲骨文的DATETIME
literal格式是这样的(MySQL也支持这个):
DATE 'YYYY-MM-DD'
在引用页面的下方,您将看到 TIMESTAMP
文字(至少在您需要的范围内)是:
TIMESTAMP 'YYYY-MM-DD HH:MI:SS'
时间应使用“24 小时”时钟,因此下午 4 点是16:00:00
。
我建议将日期逻辑更改为:
AND data >= DATE '2013-02-09' AND data < '2013-02-10'
或者,如果您热衷于在此处使用BETWEEN
,则可以使用更冗长的选项:
AND data BETWEEN DATE '2013-02-09' AND TIMESTAMP '2013-02-09 23:59:59'
关于mysql - 将 MySQL 查询转换为 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18591697/