Не зная всех ваших бизнес-правил, кроме тех, которые вы дали, вот более общее решение.
Создайте другую таблицу (или, возможно, ваша модель данных уже имеет такую таблицу) с возможными статусами в них:
CREATE TABLE status_rank (
status VARCHAR2(100) NOT NULL,
rank NUMBER NOT NULL,
PRIMARY KEY (status_name)
);
Эта таблица используется для ранжирования статусов в порядке приоритета. Другими словами, если «Отказ от запроса» следует выбрать вместо «Отклонено» в случае дубликатов, используйте приоритет 1 для отказа и 2 для отказа.
Так что теперь запрос может использовать эту дополнительную таблицу ранжирования:
SELECT b.docid, r.status
FROM b,
status_rank r,
(SELECT b.id, min(r.rank)
FROM b, status_rank r
WHERE b.status = r.status
GROUP BY id) s
WHERE b.docid = s.docid
AND r.rank = s.rank
AND b.status = r.status;
Существует множество способов выполнить запрос, но это должно показать вам общую идею.