Это сложная задача обхода графа.Идея состоит в том, чтобы установить отношение connections2
, которое имеет слова и языки в обоих направлениях, а затем использовать это для перемещения по графику.
Чтобы получить все немецкие переводы для польских слов, вы можете использовать:
with words AS (
select 1 as id, 'Cat' as word, 'ENG' as lang union all
select 2, 'Kot', 'POL' union all
select 3, 'Katze', 'GER'
),
connections as (
select 1 as id, 1 as word_a, 2 as word_b union all
select 2 as id, 1 as word_a, 3 as word_b
),
connections2 as (
select c.word_a as id_a, c.word_b as id_b, wa.lang as lang_a, wb.lang as lang_b
from connections c join
words wa
on c.word_a = wa.id join
words wb
on c.word_b = wb.id
union -- remove duplicates
select c.word_b, c.word_a, wb.lang as lang_a, wa.lang as lang_b
from connections c join
words wa
on c.word_a = wa.id join
words wb
on c.word_b = wb.id
),
cte as (
select id as pol_word, id as other_word, 'POL' as other_lang, 1 as lev, ',POL,' as langs
from words
where lang = 'POL'
union all
select cte.pol_word, c2.id_b, c2.lang_b, lev + 1, langs || c2.lang_b || ','
from cte join
connections2 c2
on cte.other_lang = c2.lang_a
where langs not like '%,' || c2.lang_b || ',%' or c2.lang_b = 'GER'
)
select *
from cte
where cte.other_lang = 'GER';
Здесь - это дБ <> скрипка.
Предположительно, вы хотите кратчайший путь.Для этого вы должны использовать этот запрос (после CTE):
select *
from cte
where cte.other_lang = 'GER' and
cte.lev = (select min(cte2.lev) from cte cte2 where ct2.pol_word = cte.pol_word);