Aquí hay un método que usa least()
y greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Esto tiene la desventaja de que podría devolver una fila que no está en la tabla. Por ejemplo, si tuviera una sola fila con "Mumbai/Chennai/500", esta consulta devolvería "Chennai/Mumbai/500", y esta fila no está en la tabla original.
Entonces, un método alternativo es:
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 versión también es compatible con ANSI y debería funcionar en todas las bases de datos.