Aqui está um método usando
least()
e greatest()
:select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Isso tem a desvantagem de que você pode retornar uma linha que não está na tabela. Por exemplo, se você tivesse uma única linha com "Mumbai/Chennai/500", essa consulta retornaria "Chennai/Mumbai/500" -- e essa linha não está na tabela original.
Assim, um método alternativo é:
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
);
Esta versão também é compatível com ANSI e deve funcionar em todos os bancos de dados.