デフォルト言語のテキストを取得する方法
-
16-10-2019 - |
質問
私はとてもテーブルを持っています:
したがって、言語テーブルのデータ:
したがって、テキストテーブルのデータ:
テキストを返しなければなりません 要求されました 言語の場合 存在します とテキスト デフォルト 言語がそうであれば 存在しない. 。でそれを行うことは可能ですか? 1 クエリ(いいえ while
, 、 お願いします)?
コード:
DECLARE @CommentId bigint = 1
--DECLARE @LanguageCode nvarchar(2) = 'en' -- "english text" returns
DECLARE @LanguageCode nvarchar(2) = 'ua' -- nothing at this moment
SELECT
t.CommentId
,t.TextId
,t.[Text]
,t.LanguageId
,RequestedLanguageId = @LanguageCode
FROM dbo.common_Text t
INNER JOIN dbo.common_LanguageType l
ON t.LanguageId = l.LanguageId
WHERE l.Code = @LanguageCode
AND t.CommentId = @CommentId
ありがとうございました。
追加した:
コードが「UA」(ウクライナ人)のテキストを要求し、これがこの言語のテキストではない場合、ロシア語のテキストを検索する場合です。見つかった場合 - OK、そうでない場合は英語のテキストを探します。言語のリストは異なる場合があります。
解決
再帰CTEを使用して、このクエリは、デフォルトチェーンのどこかで必要なコメントを持つ言語を指すすべての言語のテーブルを構築します。必要なコメントがある最初のデフォルトの隣に各言語が表示されます。次に、このテーブルをフィルターして、選択した言語の最初の利用可能なテキストを提供します。
DECLARE @CommentId BIGINT = 1;
DECLARE @LanguageCode NVARCHAR(2) = 'en';
WITH languages AS (
-- base case: language has required comment
SELECT
lt.LanguageId AS RootLanguageId
, lt.LanguageId
, lt.Code
, lt.DefaultId
, 0 AS Level
FROM
dbo.common_LanguageType lt
--WHERE
-- lt.LanguageId = lt.DefaultId
WHERE
EXISTS (
SELECT *
FROM dbo.common_Text t
WHERE
t.CommentId = @CommentId
AND t.LanguageId = lt.LanguageId
)
UNION ALL
-- recursive case: language is not its own default and
-- does not have the required comment
SELECT
l_default.RootLanguageId
, l.LanguageId
, l.Code
, l.DefaultId
, l_default.Level + 1 AS Level
FROM
dbo.common_LanguageType l
INNER JOIN languages l_default
ON l.DefaultId = l_default.LanguageId
WHERE
l.LanguageId <> l.DefaultId
AND NOT EXISTS (
SELECT *
FROM dbo.common_Text t
WHERE
t.CommentId = @CommentId
AND t.LanguageId = l.LanguageId
)
)
SELECT t.Text
FROM
languages l
INNER JOIN dbo.common_Text t
ON l.RootLanguageId = t.LanguageId
WHERE
l.Code = @LanguageCode
;
実行してみてください
SELECT *
FROM languages;
再帰的なCTEがしていることを感じたい場合。スクリプトをアップロードしてテーブルを作成し、サンプルデータを挿入し、上記のコードを実行します 要点に.
かなりセクシーですよね?
所属していません dba.stackexchange