Hier ist eine Methode, die least()
verwendet und greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Dies hat den Nachteil, dass Sie eine Zeile zurückgeben könnten, die nicht in der Tabelle enthalten ist. Wenn Sie beispielsweise eine einzelne Zeile mit „Mumbai/Chennai/500“ hätten, würde diese Abfrage „Chennai/Mumbai/500“ zurückgeben – und diese Zeile befindet sich nicht in der ursprünglichen Tabelle.
Eine alternative Methode ist also:
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
);
Diese Version ist auch ANSI-kompatibel und sollte in allen Datenbanken funktionieren.