Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL para obter registro distinto para uma combinação de duas colunas (independentemente da ordem)


Aqui está um método usando least() e greatest() :
select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);

Isso tem a desvantagem de que você pode retornar uma linha que não está na tabela. Por exemplo, se você tivesse uma única linha com "Mumbai/Chennai/500", essa consulta retornaria "Chennai/Mumbai/500" -- e essa linha não está na tabela original.

Assim, um método alternativo é:
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
                 );

Esta versão também é compatível com ANSI e deve funcionar em todos os bancos de dados.