Ето един метод, използващ least()
и greatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
Това има недостатъка, че можете да върнете ред, който не е в таблицата. Например, ако имате един ред с „Mumbai/Chennai/500“, тогава тази заявка ще върне „Chennai/Mumbai/500“ – и този ред не е в оригиналната таблица.
И така, алтернативен метод е:
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
);
Тази версия също е съвместима с ANSI и трябва да работи във всички бази данни.