首页 > 解决方案 > 子查询语句中缺少表达式?

问题描述

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

这是我的代码:

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      

标签: sqloraclesubquery

解决方案


在 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'移至主查询(您只关心非暴力的罪犯)。


推荐阅读