Каким будет запрос вида / 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