SQL_Надо Получить связанные данные в поиске по таблице

Затрудняюсь с задачей :

Таблица представлена следующими полями:

1) key
2) id
3) phone
4) mail

Тестовые данные:

1;12345;89997776655;[email protected]

2;54321;87778885566;[email protected]

3;98765;87776664577;three@mail

4; 66678;87778885566;[email protected]

5; 34567;84547895566;[email protected]

6; 34567;89087545678;[email protected]

На основании заданного поля (это может быть id, phone, mail) получить все "связанные данные"

Например: если задать поиск по условию phone = 87778885566;

Результат должен быть следующим:

2;54321;87778885566;[email protected]

4; 66678;87778885566;[email protected]

5; 34567;84547895566;[email protected]

6; 34567;89087545678;[email protected]

НА понимание связанности вывода введите сюда описание изображения


Ответы (1 шт):

Автор решения: ValNik

Думаю, лучше всего использовать рекурсивный запрос, как сказал @Akina, или делать серию запросов из приложения.Главная сложность - как остановиться в цикле выборки, "горшочек не вари!"))

with recursive rq as(
  select 1 n,key,id,phone,mail,cast(key as varchar) keys, 'first' as fl
  from log where phone='87778885566'
  group by key,id,phone,mail
  union all
  select n+1,b.key,b.id,b.phone,b.mail
     ,concat(keys,',',cast(b.key as varchar)) keys
     ,concat(case when b.id=a.id then 'id ' else ''end
     ,case when b.phone=a.phone then 'phone ' else ''end
     ,case when b.mail=a.mail then 'mail ' else ''end)
  from rq a 
  inner join (select key,id,phone,mail from log group by key,id,phone,mail) b
    on (
        ((b.id=a.id) or (b.phone=a.phone) or (b.mail=a.mail))
      )
     and position(cast(b.key as varchar) in a.keys)<1
)
select  * from rq

Пример

→ Ссылка