子查询语句中缺少表达式?
Missing expression inside sub-query statement?
我正在使用臭名昭著的“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: missing expression
00936. 00000 - "missing expression"
*Cause:
*Action:
Error at Line: 7 Column: 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: only one clause allowed per query block
01787. 00000 - "only one clause allowed per query block"
*Cause:
*Action:
Error at Line: 8 Column: 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
修复 Having 子句中的标量子查询
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'
移到了主查询中(您只关心 non-violent 的罪犯)。
我正在使用臭名昭著的“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: missing expression 00936. 00000 - "missing expression" *Cause:
*Action: Error at Line: 7 Column: 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: only one clause allowed per query block 01787. 00000 - "only one clause allowed per query block" *Cause:
*Action: Error at Line: 8 Column: 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
修复 Having 子句中的标量子查询
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'
移到了主查询中(您只关心 non-violent 的罪犯)。