Her er en metode, der bruger least()
og greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Dette har den ulempe, at du kan returnere en række, der ikke er i tabellen. Hvis du f.eks. havde en enkelt række med "Mumbai/Chennai/500", så ville denne forespørgsel returnere "Chennai/Mumbai/500" -- og denne række er ikke i den oprindelige tabel.
Så en alternativ metode er:
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
);
Denne version er også ANSI-kompatibel og burde fungere i alle databaser.