Här är en metod som använder least()
och greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Detta har nackdelen att du kan returnera en rad som inte finns i tabellen. Om du till exempel hade en enda rad med "Mumbai/Chennai/500", så skulle denna fråga returnera "Chennai/Mumbai/500" -- och den här raden finns inte i den ursprungliga tabellen.
Så en alternativ metod är:
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
);
Denna version är också ANSI-kompatibel och bör fungera i alla databaser.