Đây là một phương pháp sử dụng least()
và greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Điều này có nhược điểm là bạn có thể trả về một hàng không có trong bảng. Ví dụ:nếu bạn có một hàng duy nhất với "Mumbai / Chennai / 500", thì truy vấn này sẽ trả về "Chennai / Mumbai / 500" - và hàng này không có trong bảng gốc.
Vì vậy, một phương pháp thay thế là:
select source, destination, distance
from distance
where source < destination
union all
select destination, source, distance
from distance d
where source > destination and
not exists (select 1
from distance d2
where d2.source = d.destination and d2.destination = d.source
);
Phiên bản này cũng tương thích với ANSI và sẽ hoạt động trong tất cả các cơ sở dữ liệu.