2
votes

Supprimer la source en double vers la destination (par exemple, pour 2 entrées différentes (lignes), Delhi à Mumbai et Mumbai à Delhi, la sortie doit être une)

J'ai une table dans la base de données du serveur SQL.

Source     Destination     Fare
-------------------------------
Delhi      Mumbai           100
London     New York         500

Je dois écrire une requête SQL qui produit le résultat suivant.

Source     Destination     Fare
-------------------------------
Delhi      Mumbai           100
Mumbai     Delhi            100
London     New York         500

si vous permutez la source et la destination et qu'elle correspond à n'importe quelle ligne précédente, supprimez-la.


0 commentaires

4 Réponses :


1
votes

Une méthode utilise union all et n'existe pas :

select source, destination, fare
from t
where source < destination
union all
select source, destination, fare
from t
where source > destination and
      not exists (select 1
                  from t t2
                  where t2.source = t.destination and t2.destination = t.source
                 );


0 commentaires

1
votes

Une autre option traite les doublons en triant les sources et les destinations:

WITH cte AS (
    SELECT
        CASE WHEN Source < Destination THEN Source ELSE Destination END AS Source,
        CASE WHEN Source < Destination THEN Destination ELSE Source END AS Destination,
        Fare
    FROM yourTable
)

SELECT DISTINCT Source, Destination, Fare
FROM cte;


1 commentaires

Merci @Tim Biegeleisen, votre solution est parfaite.



0
votes

Veuillez essayer la requête:

select min(Source), max(Destination), Fare 
from 
    tbl 
where Source in (select Destination from tbl) 
group by Fare
union all
select * from 
    tbl 
where Source not in (select Destination from tbl)


2 commentaires

Que se passe-t-il si deux itinéraires différents partagent le même tarif? Votre approche regrouperait ces deux itinéraires en un seul itinéraire. Pas mon vote négatif (voir le commentaire ci-dessous pour cela).


Cela donnera un mauvais résultat du tarif Londres-> New York est également 100



1
votes

vous pouvez utiliser l'union et la comparaison

source  destination     fare
Delhi   Mumbai          100
London  New York        500

sortie

with cte as    
(
select 'Delhi' as source, 'Mumbai' as destination, 100 as fare
union all
select 'Mumbai' as source, 'Delhi' as destination, 100 as fare
union all
select 'London','New York',500
)   select  source,destination,fare from cte
    where source<destination
    union
    select  source,destination,fare        
    from cte where source<destination


0 commentaires