首页 > 解决方案 > Oracle SQL 错误“缺少表达式”(但相同的 SQL 查询在 MySQL 中有效)

问题描述

我有一个现有的大型企业应用程序,出于各种原因,我们正在将数据库从 MySQL 转换为 Oracle。我们有数百个当前的 MySQL 命令在 Oracle 中运行,没有太多麻烦,除了一个。以下 SQL 在 MySQL 上执行没有任何问题:

SELECT `user_id`, `shift_type`, `date`, COUNT(*) as c
FROM `staff`
WHERE `date` = '2020-02-02' AND `shift_type` != 'oncall'
GROUP BY user_id, shift_type, date
HAVING c > 1

这将执行并为我们提供在给定日期存在多次且符合上述标准的任何员工的结果。但是在 Oracle 中运行相同的 SQL 查询,去掉撇号(根据 Oracle 的要求),我们得到一个Error Message : ORA-00936: missing expression. 这是我尝试过的确切 Oracle SQL:

SELECT user_id, shift_type, date, COUNT(*) as c
FROM staff
WHERE date = '2020-02-02' AND shift_type != 'oncall'
GROUP BY user_id, shift_type, date
HAVING c > 1

我已经检查了很多关于此错误代码的其他 Stack Overflow 答案。大多数是指删除多余的逗号。我已经在上面的各个部分尝试过,但似乎没有任何效果。真的希望这里有人能够帮助我指出正确的方向。

标签: sqloracle

解决方案


正确的语法 -"date"而不是dateand HAVING COUNT(*)>1

SELECT user_id, shift_type, "date", COUNT(*) as c
FROM staff
WHERE "date" = '2020-02-02' 
  AND shift_type != 'oncall'
GROUP BY user_id, shift_type, "date"
HAVING COUNT(*) > 1;

db<>fiddle.com 演示


ORA-00936: 缺少表达式

Oracle 在这里期望日期文字,因此错误:

SELECT date '2020-01-01'
FROM dual

使用关键字作为标识符也不是最佳做法。


推荐阅读