Không biết tất cả các quy tắc kinh doanh của bạn khác với quy tắc bạn đã đưa ra, đây là một giải pháp chung hơn.
Tạo một bảng khác (hoặc có thể mô hình dữ liệu của bạn đã có một bảng) với các trạng thái có thể có trong chúng:
CREATE TABLE status_rank (
status VARCHAR2(100) NOT NULL,
rank NUMBER NOT NULL,
PRIMARY KEY (status_name)
);
Bảng này được sử dụng để xếp hạng các trạng thái theo thứ tự ưu tiên. Nói cách khác, nếu "Đã yêu cầu từ bỏ" nên được chọn thay vì "Bị từ chối" trong trường hợp trùng lặp, thì hãy sử dụng ưu tiên 1 cho các từ bỏ và 2 cho các từ chối.
Vì vậy, bây giờ truy vấn có thể sử dụng bảng xếp hạng bổ sung này:
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;
Có nhiều cách để thực sự thực hiện truy vấn, nhưng điều này sẽ cho bạn thấy ý tưởng chung.