SQL Запрос; Возврат всех записей основной таблицы и добавление поля из объединенной таблицы при условии; оставить значение пустым, если не найдено совпадений в объединенной таблице - PullRequest
0 голосов
/ 09 апреля 2020

Сценарий такой (я использую SQLite):

Книги основных таблиц:

CREATE TABLE "books" (
    "bookId"    integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "bookName"  nvarchar NOT NULL COLLATE NOCASE
);

Книги таблиц внешних ключейLang:

    CREATE TABLE "booksLang" (
    "bookLangId"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "BookId"    INTEGER NOT NULL,
    "LanguageID"    INTEGER NOT NULL,
    "BookName"  TEXT
);

Данные в книгах:

bookId     BookName
1          Genesis
2          Exodus
3          Leviticus
4          Numbers
5          Deuteronomy

Данные в книгахLang:

bookLangId      BookId     LanguageID     BookName_Localization
1               1          12             Genèse
2               2          12             Exode
3               1          10             Schöpfung
4               4          10             Zahlen

Вопрос: Как должен выглядеть запрос, когда заданный languageID равен 12 и должен получиться следующий результат (таблицы, books и booksLang «как-то» объединены - но скажите, как):

bookId     BookName     BookName_Localization
1          Genesis      Genèse
2          Exodus       Exode
3          Leviticus    ----- (none because there is no localization)
4          Numbers      ----- (none because there is no localization)
5          Deuteronomy  ----- (none because there is no localization)

Если languageID равен 10, результат должен выглядеть следующим образом:

bookId     BookName     BookName_Localization
1          Genesis      Schöpfung
2          Exodus       ----- (none because there is no localization)
3          Leviticus    ----- (none because there is no localization)
4          Numbers      Zahlen
5          Deuteronomy  ----- (none because there is no localization)

Поскольку я не эксперт по SQL, я не понимаю, как всегда получать все записи из таблицы книг и извлечь BookName_Localization из присоединенного, но получить "нулевой" или что-то подобное в нем.

Также могут быть локализации на многих разных языках, но результирующий набор должен всегда содержать только одну запись для каждой основной записи (не меньше или не больше) - обогащается полем BookName_Localization из объединенной таблицы booksLang для данного LanguageID , Значение этого дополнительного поля либо содержит локализованный текст для данного языка, если он существует, либо, если он не существует, должен быть пустым.

Любая помощь приветствуется.

* Отредактировано из-за плохого форматирования

1 Ответ

1 голос
/ 09 апреля 2020

Я думаю, что вы описываете LEFT JOIN:

select b.*, bl.bookname
from books b left join
     bookslang bl
     on bl.BookId = b.BookId and bl.languageId = 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...