#sql #oracle #subquery
#sql #Oracle #вложенный запрос
Вопрос:
Я использую печально известную схему «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
Комментарии:
1. Синтаксически похоже, что вы неправильно разместили закрывающую скобку, ), в этой строке,
FROM crimes)
. Вы можете просто удалить его.2. Я пробовал, и это то же самое с круглыми скобками и без. Если вы говорите о строке 6, в ней возникает ошибка «Отсутствует правая скобка».
3. почему вы используете
DISTINCT crime_id
? может ли это быть общим для разныхcriminal_id
?4. Изменение crime_ID на crimeal_id не решает мою проблему.
Ответ №1:
Исправьте свой скалярный подзапрос в предложении 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'
в основной запрос (вас беспокоит только преступник, который не является насильственным).
Комментарии:
1. Спасибо, но ваш код выдает ошибку: «ORA-00979: не группируется ПО выражению 00979. 00000 — «не группируется ПО выражению» * Причина: * Действие: ошибка в строке: 7 Столбец: 5″
2. @GregNog это исправлено
3. Я точно скопировал ваш код. «ORA-00979: не ГРУППА ПО выражению 00979. 00000 — «не ГРУППА ПО выражению» * Причина: * Действие: ошибка в строке: 12 Столбец: 13″
4. @GregNog исправил использование v_status в вложенном запросе