2014-10-08 1 views
0

Я использую SQL (H2 database engine ver 1.4.181) и пытаюсь суммировать 5 лучших баллов, которые имеет учащийся. Таблица RESULTS включает идентификатор studentID, eventID и точки. Каждый учащийся может быть введен только один раз. Следующий подзапрос, что я пытаюсь использовать, чтобы сделать это для студента с и идентификатор 5.SQL ORDER BY in IN subquery не возвращает результатов

SELECT SUM(points) FROM RESULTS 
    WHERE eventID IN 
     (SELECT TOP 5 eventID FROM RESULTS 
      WHERE studentID = 5 ORDER BY points DESC) 
     AND studentID = 5; 

Однако этот запрос возвращает нуль. Я обнаружил, что если удаляется ORDER BY points DESC, то остальная часть запроса работает. Кто-нибудь знает, как включить ORDER BY или почему он не работает?

Благодаря

+1

Какая система баз данных вы используете и какую версию? –

+0

Имеет ли столбец 'point' значение null? –

ответ

0

пытаются использовать соединение, вы можете использовать SQL как этот belw

select sum(x.points) from 
(select points , event_id from RESULTS) X 
(select eventID from 
(SELECT eventID, row_number() over (partition by points ORDER BY points DESC) tops FROM RESULTS) X 
where tops<6) Y 
where X.eventID=y.eventID 
and X.studentID = 5; 
+1

Я получаю: 'Синтаксическая ошибка в SQL заявление«SELECT SUM (X.POINTS) FROM (SELECT ТОЧЕК, EVENTID ОТ РЕЗУЛЬТАТОВ) X ([*] SELECT, FROM EVENTID (SELECT EVENTID, ROW_NUMBER() OVER (ОПРЕДЕЛЕНИЕ ПУНКТОВ ПОСРЕДСТВОМ ПУНКТОВ ДЕК) ТОПЫ ИЗ РЕЗУЛЬТАТОВ) X ГДЕ ТУРЫ <6) Y ГДЕ X.EVENTID = Y.EVENTID И X.STUDENTID = 32179 "; [42000-181] 42000/42000' – Jess

2

Это выглядит как ошибка в Н2. Вы можете использовать соединение. Полный тестовый пример:

create table results(eventId int, points int, studentId int); 
insert into results values(1, 10, 1), (2, 20, 1), (3, 5, 1); 
insert into results values(1, 10, 2), (2, 20, 2), (3, 5, 2); 
insert into results values(1, 10, 3), (2, 20, 3), (3, 5, 3); 

SELECT SUM(r.points) FROM RESULTS r, 
(SELECT eventID FROM RESULTS 
    WHERE studentID = 2 
    ORDER BY points DESC 
    LIMIT 2) r2 
WHERE r2.eventID = r.eventId 
AND studentID = 2; 
0

Оказывается, мне не нужен запрос IN вообще. Следующие отлично сработали:

SELECT SUM(points) FROM 
    (SELECT TOP 5 points FROM RESULTS 
     WHERE studentID = 5 
     ORDER BY points DESC);