2016-08-08 2 views
0

У меня возникли трудности с возвратом первой строки только из следующего запроса. Я пытаюсь вернуть самое низкое значение в столбце RESULT для конкретного события, которое отлично работает, но оно также возвращает другие строки, я просто хочу его. Каков наилучший способ достичь этого?Выберите самое низкое значение и верните только первую строку

SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, M.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, (SELECT MIN(RESULT) 
FROM RANK) 
FROM EVENT E JOIN 
RANK R 
ON E.EVENT_ID = R.EVENT_ID JOIN 
MEMBER M 
ON M.MEMBER_ID = R.MEMBER_ID 
WHERE E.EVENT_ID = 'EVENT001' 
ORDER BY RESULT; 

ответ

1

подзапрос в растворе ниже, скопировать и вставить из исходного поста, я не проверял (очевидно, так как у меня не было таблиц), за исключением дополнительного поля : ROW_NUMBER() OVER .... вместо MIN (RESULT ...)

Это назначает строку в каждом «разделе», используя указанное обозначение (уведомление DESC), а во внешнем запросе вы выбираете строки где этот row_number равен 1.

SELECT EVENT_ID, EVENT_TYPE, EVENT_NAME, MEMBER_ID, 
     MEMBER_FIRSTNAME, MEMBER_LASTNAME, RESULT 
FROM 
(
    SELECT E.EVENT_ID, E.EVENT_TYPE, E.EVENT_NAME, 
      M.MEMBER_ID, M.MEMBER_FIRSTNAME, M.MEMBER_LASTNAME, 
      R.RESULT, 
      row_number() over (partition by e.event_id order by r.result) as rn 
    FROM EVENT E JOIN 
      RANK R 
      ON E.EVENT_ID = R.EVENT_ID JOIN 
      MEMBER M 
      ON M.MEMBER_ID = R.MEMBER_ID 
    WHERE E.EVENT_ID = 'EVENT001' 
) 
WHERE RN = 1; 

Предполагается, что вы хотите вернуться на один ряд, даже если есть ничья для самого низкого балла. Если есть связи, какая строка будет выбрана, не определено (по крайней мере, с этим решением, вы можете добавить дополнительные предложения в ORDER BY). Если в случае связей вы хотите, чтобы все связанные члены были перечислены, то вы можете использовать DENSE_RANK() вместо ROW_NUMBER().

+0

Это возвращает недопустимое имя таблицы. Я не понимаю, почему? –

+0

Указывает, какое имя таблицы недействительно? Мой front-end, независимо от того, использую ли я SLQ * Plus, SQL Developer или Toad, всегда. – mathguy

+0

Я использую приложение oracle express, это, к сожалению. –

0

Так вместе с Роу result вы хотите, чтобы показать это событие имеет минимальное result. Используйте MIN OVER для этого:

select 
    e.event_id, 
    e.event_type, 
    e.event_name, 
    m.member_id, 
    m.member_firstname, 
    m.member_lastname, 
    r.result, 
    min(r.result) over() as min_result 
from event e 
join rank r on e.event_id = r.event_id 
join member m on m.member_id = r.member_id 
where e.event_id = 'EVENT001' 
order by r.result; 
+0

Извините, я просто хотел показать минимальный результат, а не оба. Я отредактировал эту часть. –

+0

OP хочет вернуть только имя члена с наименьшим результатом. Поэтому вам нужно обернуть этот запрос в внешний запрос и фильтр с помощью 'result = min_result'. – mathguy

+0

@James B: Хорошо, это еще одна задача. Как говорит mathguy: оберните это внешним запросом. Вы также можете использовать 'rank' (или' dense_rank') вместо 'min over'. Однако самым простым способом было бы просто добавить «FETCH FIRST 1 ROW WITH TIES», но это доступно только для Oracle 12c. –

Смежные вопросы