Oto jedna metoda wykorzystująca least()
i greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Ma to tę wadę, że możesz zwrócić wiersz, którego nie ma w tabeli. Na przykład, jeśli masz pojedynczy wiersz z „Mumbai/Chennai/500”, to zapytanie zwróci „Chennai/Mumbai/500” – a tego wiersza nie ma w oryginalnej tabeli.
Tak więc alternatywną metodą jest:
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
);
Ta wersja jest również zgodna z ANSI i powinna działać we wszystkich bazach danych.