将MySQL查询转换为Oracle

时间:2013-09-03 11:54:43

标签: 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:表名无效

如果我将查询更改为:

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中运行。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

首先,您从[log]表中删除方括号是正确的。方括号不是有效的分隔符,它们不是表名的有效字符。

其次,Oracle不喜欢AS中的SELECT ... FROM myTable AS myAlias。它允许AS用于列别名,但不允许用于表别名,因此将As放在As groupedTable中。

第三,您的日期格式可能无效。如果不是,它仍然是一个潜在的失败点。 Oracle的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'