【问题标题】:Converting a MySQL query to Oracle将 MySQL 查询转换为 Oracle
【发布时间】:2013-09-06 15:41:03
【问题描述】:

以下查询在 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 中工作。有人可以帮帮我吗?

【问题讨论】:

标签: mysql oracle database-migration


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,现在可以了... SELECT total, status.nome FROM status INNER JOIN (SELECT COUNT(*) as total, status_id FROM log WHERE eventto_id = '21' AND data >= DATE ' 2013-09-02' AND 数据
  • 太棒了!但请注意,原始问题中的逻辑是在 9/2/2013 上查找任何时间的日期。为此,您需要以... AND data &lt; DATE '2013-09-03 结束WHERE(小于、不小于或等于您的评论中的like)。如果您使用 &lt;=,则将包含 2013 年 9 月 3 日午夜的日期。
  • 是的,我现在看到了...我更改为 SELECT total, status.nome FROM status INNER JOIN (SELECT COUNT(*) as total, status_id FROM log WHERE eventto_id = '21' AND数据 >= TIMESTAMP '2013-09-02 00:00:00' AND 数据
猜你喜欢
  • 2019-07-29
  • 2018-11-01
  • 2013-07-10
  • 2015-10-03
  • 1970-01-01
  • 2012-02-06
  • 2012-06-08
  • 2013-09-29
  • 2012-07-15
相关资源
最近更新 更多