子查询语句中缺少表达式?
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 的使用以上是关于子查询语句中缺少表达式?的主要内容,如果未能解决你的问题,请参考以下文章