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.
4 Réponses :
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
);
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;
Merci @Tim Biegeleisen, votre solution est parfaite.
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)
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
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