sql >> Base de Datos >  >> RDS >> Mysql

SQL para obtener un registro distinto para una combinación de dos columnas (independientemente del orden)

Aquí hay un método que usa least() y greatest() :

select least(source, destination), greatest(source, destination), max(distance)
from distance
group by least(source, destination), greatest(source, destination);

Esto tiene la desventaja de que podría devolver una fila que no está en la tabla. Por ejemplo, si tuviera una sola fila con "Mumbai/Chennai/500", esta consulta devolvería "Chennai/Mumbai/500", y esta fila no está en la tabla original.

Entonces, un método alternativo es:

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 versión también es compatible con ANSI y debería funcionar en todas las bases de datos.