Zde je jedna metoda využívající least()
a greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
To má tu nevýhodu, že byste mohli vrátit řádek, který není v tabulce. Pokud byste například měli jeden řádek s „Mumbai/Chennai/500“, pak by tento dotaz vrátil „Chennai/Mumbai/500“ – a tento řádek není v původní tabulce.
Alternativní metoda je tedy:
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
);
Tato verze je také kompatibilní s ANSI a měla by fungovat ve všech databázích.