У меня есть таблица со следующей структурой:
IdM|IdS
-------
1 | 2
1 | 3
1 | 4
2 | 1
2 | 3
2 | 4
3 | 1
3 | 2
3 | 3
3 | 4
Как я могу сделать оператор выбора для этой таблицы, который вернет некоторые строки этой таблицы, где в каждой строке определенный идентификатор появляется только один, безразлично, в каком столбце он указан?
Для приведенного выше набора результатов я хотел бы, чтобы запрос возвращал:
-------
1 | 2
3 | 4
-------
Чтобы привести другой пример, если вы опустите первую строку в исходном наборе данных:
IdM|IdS
-------
1 | 3
1 | 4
2 | 1
2 | 3
2 | 4
3 | 1
3 | 2
3 | 3
3 | 4
набор результатов должен быть:
-------
1 | 3
2 | 4
-------
Это на самом деле интересная проблема. Если я правильно понял вас, вы хотите перебрать набор данных и сохранить только те строки, в которых оба значения никогда раньше не встречались. Вы можете использовать рекурсивный запрос:
with recursive
data as (
select idm, ids, row_number() over(order by idm, ids) rn
from mytable
where idm <> ids
),
cte as (
select idm, ids, rn, 1 as to_keep , concat(idm, ',', ids) visited from data where rn = 1
union all
select d.idm, d.ids, d.rn,
(not find_in_set(d.idm, c.visited) and not find_in_set(d.ids, c.visited)),
case when (not find_in_set(d.idm, c.visited) and not find_in_set(d.ids, c.visited))
then concat_ws(',', c.visited, d.idm, d.ids)
else c.visited
end
from cte c
inner join data d on d.rn = c.rn + 1
)
select idm, ids from cte where to_keep
Первый CTE перечисляет строки, упорядоченные по обоим столбцам. Затем рекурсивный запрос просматривает набор результатов, проверяет, являются ли оба значения новыми, и устанавливает соответствующий флаг для столбцов. Помеченные номера сохраняются для использования при фильтрации в следующей итерации.
Обратите внимание, что, учитывая ваше требование, не все значения могут отображаться в наборе результатов. Рассмотрим следующий набор данных:
idm ids
+-----+---
1 2
1 3
1 4
Ваша логика вернет только первую строку.
Для меня это не проблема, на самом деле это желаемый результат. Я хочу использовать это, чтобы предложить возможные записи в таблице, которые похожи и могут быть объединены. Поскольку логика моей таблицы позволяет объединять только две отдельные строки в одну (путем создания новой строки и предоставления в качестве псевдонима версии двух предыдущих строк), это как раз желаемое поведение, если есть вероятность, что идентификатор 1 соответствует всем три других идентификатора. После того, как администратор вручную выполнил слияние или проигнорировал его, либо будут добавлены новые пары идентификаторов, либо будет сопоставлена другая пара. Спасибо за ответ!:)