Отсутствует выражение внутри оператора вложенного запроса?

#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 в вложенном запросе