Удаление повторяющихся записей в SQL - PullRequest
1 голос
/ 04 апреля 2020

У меня есть таблица, аналогичная приведенной ниже.

    |----------|---------|
    |  NAME1   |  NAME2  | 
    |----------|---------|   
    |     R1   |   R2    |  
    |     R3   |   R4    |  
    |     R2   |   R1    |  
    |     R1   |   R5    |  
    |     R4   |   R3    |  
    |--------------------|

Но здесь мне нужно рассматривать кортежи (R1, R2) и (R2, R1) как одинаковые. Это означает, что только один из кортежей (R1, R2) и (R2, R1) может быть в финальной таблице. Аналогично, (R4, R3) и (R3, R4) одинаковы. Это означает, что только один из кортежей (R3, R4) и (R4, R3) может быть в финальной таблице.

Таблица финалов должна выглядеть следующим образом.

   |----------|---------|
   |  NAME1   |  NAME2  | 
   |----------|---------|   
   |     R1   |   R2    |  
   |     R3   |   R4    |  
   |     R1   |   R5    |  
   |--------------------|

Как мне это сделать это с SQL?

1 Ответ

1 голос
/ 04 апреля 2020

Вы можете попробовать использовать удаление с существующими логами c:

DELETE
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2
              WHERE t2.Name2 = t1.Name1 AND t2.Name1 = t1.Name2) AND
      Name1 > Name2;

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

Если вместо этого вы просто хотите просмотреть ваши данные таким образом, используйте наименьший / наибольший трюк:

SELECT DISTINCT
    LEAST(Name1, Name2) AS Name1,
    GREATEST(Name1, Name2) AS Name2
FROM yourTable;
...