Ошибка: недопустимое выражение в списке выбора (не содержится ни в агрегатной функции, ни в предложении GROUP BY)

Я использую Firebird SQL. Приведенный ниже запрос возвращает 4 строки, как показано на рисунке.

    SELECT a.EPS_ID,b.C_NAME,c.AY_YR_NAME,d.S_NAME,e.E_NAME
FROM 
    TBLEXAMPLANNER_S_MSB a, 
    TBLCLASS_MSB b, 
    TBLACADEMICYEAR_MSB c, 
    TBLSUBJECTS_MSB d, 
    TBLEXAMTYPE_MSB e
WHERE 
    a.EPS_CLASS_ID=b.C_ID 
AND a.EPS_SESSION_ID=c.AY_ID 
AND a.EPS_SUB_ID=d.S_ID 
AND a.EPS_PE_ID=e.E_ID

нажмите, чтобы просмотреть изображение

I want it to return only 1 (one) row like

EPS_ID     C_NAME    AY_YR_NAME   S_NAME   E_NAME
---------------------------------------------------
7          5         2016-2017    English  FA1 

Я использую следующий запрос, но он не работает.

SELECT a.EPS_ID,MAX(b.C_NAME) AS XT,c.AY_YR_NAME,d.S_NAME,e.E_NAME
FROM 
    TBLEXAMPLANNER_S_MSB a, 
    TBLCLASS_MSB b, 
    TBLACADEMICYEAR_MSB c, 
    TBLSUBJECTS_MSB d, 
    TBLEXAMTYPE_MSB e
WHERE 
    a.EPS_CLASS_ID=b.C_ID 
AND a.EPS_SESSION_ID=c.AY_ID 
AND a.EPS_SUB_ID=d.S_ID 
AND a.EPS_PE_ID=e.E_ID
GROUP BY a.EPS_ID,d.S_NAME

Сообщение об ошибке :

Недопустимое выражение в списке выбора (не содержится ни в одном из
агрегатная функция или предложение GROUP BY)

3 ответа

  1. Научитесь использовать правильный, явный JOINсинтаксис.

    Ваша проблема заключается в том, что все неагрегированные столбцы должны быть в GROUP BY:

    SELECT a.EPS_ID, MAX(b.C_NAME) AS XT, c.AY_YR_NAME, d.S_NAME, e.E_NAME
    FROM TBLEXAMPLANNER_S_MSB a JOIN 
         TBLCLASS_MSB b
         ON a.EPS_CLASS_ID = b.C_ID JOIN
         TBLACADEMICYEAR_MSB c
         ON a.EPS_SESSION_ID = c.AY_ID JOIN
         TBLSUBJECTS_MSB d
         ON a.EPS_SUB_ID = d.S_ID JOIN 
         TBLEXAMTYPE_MSB e
         ON a.EPS_PE_ID = e.E_ID
    GROUP BY a.EPS_ID, c.AY_YR_NAME, d.S_NAME, e.E_NAME;
    

    Примечание: Я также рекомендую использовать аббревиатуры таблиц для псевдонимов таблиц. Так, epдля TBLEXAMPLANNER_S_MSBвместо a. Произвольные псевдонимы таблиц затрудняют выполнение запроса.

  2. Использование GROUP BYделает двигатель сгруппировать записи для вас. Для группирования необходимо дать рекомендации СУБД для каждого столбца, что следует делать.

    • Группа? — >Добавить столбец в GROUP BY-Clause
    • Не группировать? — >хорошо, что еще?
      • игнорировать колонку? удалите его из предложения select
      • Суммировать? -> использовать SUM(mycol)
      • другие функции агрегации можно найти в документации

    Дополнительно: в вашем случае вы пытаетесь сгруппироватьсяEPS_ID, что является уникальным в каждой строке. Таким образом, группировка по этому столбцу вернет все строки, потому что группировать нечего. Чтобы сгруппировать записи, они должны иметь одно и то же значение.