SQLite; Посмотреть; слева соединить два стола; подставить значение динамически с переводом из объединенной таблицы, если есть перевод на данном языке - PullRequest
0 голосов
/ 10 апреля 2020

Каким будет запрос вида / SQL, для достижения цели, указанной в заголовке.

Создание кода для соответствующих таблиц:

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

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

Данные в таблице BookLang:

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

Цель: запрос / представление должны иметь те же поля, что и таблица книги (BookId, BookName), и всегда выводить строку для каждой записи в таблице книг, но динамически подставлять значение для BookName из таблицы BooksLang, если существует локализованная (переведенная) версия для данный язык и тот же BookId. Если замены нет, выходным значением BookName должно быть значение из записи в таблице книг.

Пример: Если запрос к этому представлению выглядит следующим образом: select * from <view> where LanguageID = 12

тогда результат должен быть:

bookId     BookName
1          Genèse       (substituted from booksLang table)
2          Exode        (substituted from booksLang table)
3          Leviticus    (original from books table because no substitute for given language available)
4          Numbers      (original from books table because no substitute for given language available)
5          Deuteronomy  (original from books table because no substitute for given language available)

Поскольку я не SQL эксперт - Как это можно сделать?

Подсказка: Приведенный ниже запрос извлекает желаемый результат, когда languageID предоставляется как часть левого соединения - но как сделать это динамически из запроса, который запрашивает это представление?

select b.bookId, 
(CASE
    WHEN bl.bookName is null
    THEN b.bookName
    ELSE bl.bookname
END) as bookName
from books b left join
     bookslang bl
     on bl.BookId = b.BookId and bl.languageId = 12

1 Ответ

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

Создайте это представление:

create view books_langs as
  select b.bookId, coalesce(bl.bookName, b.bookName) as bookName, d.languageId
  from (select id as languageId from languages) d cross join 
  books b left join bookslang bl
  on bl.BookId = b.BookId and bl.languageId = d.languageid;

, а затем запросите его следующим образом:

select bookid, bookname 
from books_langs
where languageid = ?

См. Демоверсию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...