mysql - 将 MySQL 查询转换为 Oracle

标签 mysql oracle database-migration

以下查询在 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/

相关文章:

mysql - MsSQL 到 MySQL 的迁移

node.js - 使用 knexjs 创建角色

php - 使用 mySQL 准备语句选择多列

mysql - 这些 MySQL 查询方法中哪种更快?

python - 使用 Python 连接 MySQL 数据库时出错

php - 如何获取表的主键?

database - 语句影响性能的情况。

sql - 使用单个 .sql 脚本文件创建多个表

sql - 解释 Toad 超过 500 行的查询时间

mysql - 将 mysql 数据库更改从本地推送到临时/生产