Berikut adalah salah satu metode menggunakan least()
dan greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Ini memiliki kelemahan bahwa Anda dapat mengembalikan baris yang tidak ada di tabel. Misalnya, jika Anda memiliki satu baris dengan "Mumbai/Chennai/500", maka kueri ini akan mengembalikan "Chennai/Mumbai/500" -- dan baris ini tidak ada di tabel asli.
Jadi, metode alternatifnya adalah:
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
);
Versi ini juga kompatibel dengan ANSI dan dapat digunakan di semua database.