SQL дублирование строк при объединении (JOIN) нескольких таблиц

В базе данных есть три таблицы: words, phrases и examples. Первая хранить конкретное слова; вторая - фразы с этим словом; третья - примеры с ним. Две последнии относятся к таблице words как один ко многим: одному слову может соответсвовать множество фраз и/или примеров.

Проблема в том, что при попытке объеденить данные из трех этих таблиц при помощи такого запроса

select words.word, examples.eng_example, examples.ru_example, phrases.eng_phrase,  phrases.ru_phrase from words
    inner join examples on examples."wordId" = words.id
        inner join phrases on phrases."wordId" = words.id

на выходе получаю такую таблицу с повторяющимеся строками (они выделены желтым): Таблица, содержащая повторяющиеся данные

Собственно вопрос: почему так происходит? можно ли получить что-то вроде этого? Таблица, не содержащая повторяющиехся данных

И что делать если количество строк из examples не равно количеству строк из phrases?

P.S. Использую SQLite


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

Автор решения: Никита

Вы уверены, что используете JOIN правильно? Не лучше ли здесь будет использовать OUTER JOIN? Гайд по join

По второму вопросу, посмотрите функцию sql 'Coalesce' Сссылка

Мне кажется у Вас пропущена связь между "фразами" и "примерами", лучше сделать так: во фразах foreign key до id слова, а в примерах foreign key до фразы. Идея в том, чтобы убрать зависимость пример-слово, и перенести ее на таблицу с фразами, хотя на самом деле и это не верно.

Если у Вас подразумевается, что у одного слова есть одна фраза и один пример, сделайте промежуточную таблицу: id | word_id | phrase_id | example_id и выводите из нее данные через LEFT JOIN заменяя null COALESCE, для этой таблицы пропишите foreign key для word_id с параметром ON DELETE CASCADE.

Удачи.

→ Ссылка