Postgresql - исключить повторяющиеся записи - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующая таблица:

+-----+-----+
| id1 | id2 |
+-----+-----+
| 1   | 2   |
| 1   | 3   |
| 2   | 1   |
| 2   | 3   |
| 5   | 1   |
| 5   | 2   |
+-----+-----+

Я не хочу получать дублированные записи, такие как

1 | 2
2 | 1

В конце концов мне нужно следующее:

+-----+-----+
| id1 | id2 |
+-----+-----+
| 1   | 2   |
| 1   | 3   |
| 2   | 3   |
| 5   | 1   |
| 5   | 2   |
+-----+-----+

Как лучше всего это сделать?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Я нашел решение сам.Я думаю, мой вопрос был плохо сформулирован.

SELECT DISTINCT
    CASE WHEN u.id1 > u.id2 THEN u.id2
        ELSE u.id1
    END as id1,
    CASE WHEN u.id1 < u.id2 THEN u.id2
        ELSE u.id1
    END as id2
FROM table u

Я отсортировал меньшие значения влево.
DISTINCT устраните дубликаты.

0 голосов
/ 20 сентября 2018

Если вы можете иметь не более двух записей на пару, то:

select id1, id2
from t
where id1 < id2
union all
select id1, id2
from t
where id2 > id1 and
      not exists (select 1 from t t2 where t2.id1 = t.id2 and t2.id2 = t.id1);

Если вы просто хотели уникальные пары, я бы использовал least() и greatest():

select least(id1, id2), greatest(id1, id2)
from t
group by least(id1, id2), greatest(id1, id2);

РЕДАКТИРОВАТЬ:

Вы также можете сделать это с помощью оконных функций или distinct on:

select distinct on (least(id1, id2), greatest(id1, id2)) t.*
from t
order by least(id1, id2), greatest(id1, id2);
0 голосов
/ 20 сентября 2018

Как насчет этого:

DELETE FROM table WHERE (id1, id2) IN 
(SELECT t1.id1, t1.id2 FROM table t1 INNER JOIN table t2 ON t1.id1 = t2.id2 AND t1.id2 = t2.id1);

РЕДАКТИРОВАТЬ:

О, я думал, что вы хотели удалить их обоих.

DELETE FROM table WHERE (id1, id2) NOT IN(
SELECT least(id1, id2), greatest(id1, id2)
FROM table);

Или

SELECT DISTINCT least(id1, id2), greatest(id1, id2)
FROM table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...