#sql #postgresql
Вопрос:
У меня есть следующая таблица —
A B C D
1720116452 1053384214 1205809217 1053384214
1053695668 1083893937 1518906734 1740293257
1053695668 1083893937 1518906734 1740293257
1053695668 1124136593 1518906734 1740293257
1053695668 1124136593 1518906734 1740293257
1053695668 1124136593 1518906734 1740293257
1053695668 1124136593 1518906734 1740293257
1124136593 1518906734 1740293253 1053695668
Как я могу написать запрос для получения этих выходных данных —
A B
1720116452 1053384214
1720116452 1205809217
1720116452 1053384214
1053695668 1083893937
1053695668 1518906734
1053695668 1740293257
1053695668 1124136593
1124136593 1740293253
1124136593 1518906734
Выходная таблица-это таблица соединений между всеми столбцами входной таблицы. Например, если значение column A <> column B
во входной таблице, затем вставьте запись в выходную таблицу. Если введено значение column A <> column C
, затем вставьте другую запись. Причина, по которой строки 5, 6, 7 и 8 опущены из выходных данных, заключается в том, что эти соединения уже существуют в выходных данных.
Причина, по которой 1124136593 подключен только к 2 значениям, а не к 3, заключается в том, что 1053695668 уже подключен к нему в строке 7 вывода.
Комментарии:
1.
(1720116452, 1053384214)
это вдвое больше вашего ожидаемого результата, почему? И почему(1124136593, 1053695668)
пропал без вести?2. Вы можете просто написать столько союзов, сколько вам нужно, с нужными вам столбцами
3. вы хотите вставить его в другую таблицу или просто хотите получить результат.
Ответ №1:
Я думаю, что вы описываете непривязанную операцию с удалением дубликатов в любом направлении:
select distinct on (least(v.a, v.b), greatest(v.a, v.b)) v.a, v.b
from t cross join lateral
(values (a, b), (a, c), (a, d)) v(a, b)
order by least(v.a, v.b), greatest(v.a, v.b);
Использование distinct on
здесь предотвращает «обратные» дубликаты. Это также гарантирует, что результирующие значения будут a
в первом столбце.
Комментарии:
1. Как насчет (b, c), (b, d), (c, b) (c, d), (d, b) и т. Д.?
2. @Аарон . . . Вы, очевидно, можете включить их, если хотите. Однако в вопросе они не упоминаются.
3. Для чего наименьшее и наибольшее?
4. @Aaron . . . Чтобы предотвратить «обратные» дубликаты.