Удаление дубликата с помощью sql

Я задавал этот вопрос раньше, но не могу получить ссылку.

Вопрос в том:

У меня есть таблица полетов, содержащая следующие значения:

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
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
30
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать оператор 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)

@DreamerP да. Строки в SQL имеют полный порядок.

Mureinik 01.07.2018 18:53

Предполагая, что тарифы всегда одинаковы между любыми двумя городами независимо от направления, вы можете сгруппировать по «отсортированной» паре и получить максимальную (или минимальную, по предположению они одинаковы) тариф.

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
                 );

Другие вопросы по теме