Я задавал этот вопрос раньше, но не могу получить ссылку.
Вопрос в том:
У меня есть таблица полетов, содержащая следующие значения:
From_City To_City Fare
A B 50000
B A 50000
A C 60000
Как удалить из A в B или из B в A, поскольку он имеет то же значение.
Окончательный результат должен быть:
From_City To_City Fare
A B 50000
A C 60000


Вы можете использовать оператор exists. Поскольку вы хотите удалить только одну строку из пары дубликатов, вам необходимо принять произвольное решение, какую из них оставить, а какую удалить. В следующем запросе я решил оставить тот, у которого нижний from_city:
SELECT *
FROM flights a
WHERE NOT EXISTS (SELECT *
FROM flights b
WHERE a.from_city = b.to_city AND
a.to_city = b.from_city AND
a.fare = b.fare AND
b.from_city > b.to_city)
Предполагая, что тарифы всегда одинаковы между любыми двумя городами независимо от направления, вы можете сгруппировать по «отсортированной» паре и получить максимальную (или минимальную, по предположению они одинаковы) тариф.
SELECT CASE
WHEN from_city > to_city,
THEN to_city
ELSE from_city
END from_city,
CASE
WHEN from_city > to_city,
THEN from_city
ELSE to_city
END from_city,
max(fare) fare
FROM elbat
GROUP BY CASE
WHEN from_city > to_city,
THEN to_city
ELSE from_city
END,
CASE
WHEN from_city > to_city,
THEN from_city
ELSE to_city
END;
Я бы посоветовал:
select f.*
from flights f
where f.from_city < f.to_city
union all
select f.*
from flights
where f2.from_city > f.to_city and
not exists (select 1
from flights f2
where f2.from_city = f.to_city and
f2.to_city = f.from_city and
f2.fare = f.fare
);
@DreamerP да. Строки в SQL имеют полный порядок.