子查询语句中缺少表达式?

Posted

技术标签:

【中文标题】子查询语句中缺少表达式?【英文标题】:Missing expression inside sub-query statement? 【发布时间】:2020-10-07 14:59:07 【问题描述】:

我正在使用臭名昭著的“CityJail”架构来回答一个问题“列出所有犯罪次数超过平均水平且未被列为暴力犯罪者的罪犯的姓名。”

这是我的代码:

SELECT first, last 
FROM criminals NATURAL JOIN
crimes
GROUP BY first, last
HAVING COUNT(*) > (SELECT AVG(COUNT(DISTINCT crime_id))
FROM crimes)
AND (SELECT v_status = 'N' FROM crimes)
GROUP BY first, last
);

但我得到一个错误:

ORA-00936: 缺少表达式 00936. 00000 - “缺少表达式” *原因: *行动: 行错误:7 列:22

当我将代码更改为:

SELECT first, last 
FROM criminals NATURAL JOIN
crimes
GROUP BY first, last
HAVING COUNT(*) > (SELECT AVG(COUNT(DISTINCT crime_id))
FROM crimes)
AND v_status = 'N'
GROUP BY first, last
);

我收到一个错误:

ORA-01787: 每个查询块只允许一个子句 01787. 00000 - “每个查询块只允许一个子句” *原因: *行动: 行错误:8 列:1

我做错了什么?

罪犯:

Name        Null?    Type         
----------- -------- ------------ 
CRIMINAL_ID NOT NULL NUMBER(6)    
LAST                 VARCHAR2(15) 
FIRST                VARCHAR2(10) 
STREET               VARCHAR2(30) 
CITY                 VARCHAR2(20) 
STATE                CHAR(2)      
ZIP                  CHAR(5)      
PHONE                CHAR(10)     
V_STATUS             CHAR(1)      
P_STATUS             CHAR(1)    

犯罪:

Name            Null?    Type      
--------------- -------- --------- 
CRIME_ID        NOT NULL NUMBER(9) 
CRIMINAL_ID     NOT NULL NUMBER(6) 
CLASSIFICATION           CHAR(1)   
DATE_CHARGED             DATE      
STATUS                   CHAR(2)   
HEARING_DATE             DATE      
APPEAL_CUT_DATE          DATE      
DATE_RECORDED            DATE      

【问题讨论】:

从语法上看,您似乎错误地放置了右括号,),在这一行,FROM crimes)。你可以删除它。 我试过了,有括号和没有括号都是一样的。如果您在谈论第 6 行,则会出现“缺少右括号”错误。 你为什么使用DISTINCT crime_id?这可以在不同的criminal_id 之间共享吗? 将crime_ID 更改为criminal_ID 并不能解决我的问题。 【参考方案1】:

在 Have 子句中修复标量子查询

  SELECT first
      , last
   FROM criminals cls
NATURAL
   JOIN crimes 
  WHERE v_status = 'N'
  GROUP BY first
      , last
 HAVING COUNT(1) >(
         SELECT AVG(COUNT(DISTINCT crime_id))
   FROM crimes
   GROUP BY criminal_id);
  

标量查询在您的两次尝试中均格式错误。

我将条件WHERE v_status = 'N' 移至主查询(您只关心非暴力的罪犯)。

【讨论】:

谢谢,但您的代码出错:“ORA-00979:不是 GROUP BY 表达式 00979。00000 -“不是 GROUP BY 表达式” *原因:*操作:第 7 列错误: 5" @GregNog 这是固定的 我完全复制了你的代码。 “ORA-00979:不是 GROUP BY 表达式 00979。00000 - “不是 GROUP BY 表达式”*原因:*操作:第 12 行第 13 列错误” @GregNog 更正了子查询中 v_status 的使用

以上是关于子查询语句中缺少表达式?的主要内容,如果未能解决你的问题,请参考以下文章

查询表达式中的语法错误(缺少运算符),Oledb UPDATE 语句

Mysql常用sql语句(20)- 子查询重点知识

Mysql常用sql语句(20)- 子查询重点知识

在 Oracle 更新语句中使用子查询而不是表名

如何在 caes 语句中使用子查询

不使用 EXISTS 嵌套 case 语句引入子查询时,选择列表中只能指定一个表达式