これがleast()
を使用する1つのメソッドです およびgreatest()
:
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);
これには、テーブルにない行を返す可能性があるという欠点があります。たとえば、「Mumbai / Chennai / 500」の行が1つある場合、このクエリは「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互換であり、すべてのデータベースで機能するはずです。