質問

私はとてもテーブルを持っています:enter image description here

したがって、言語テーブルのデータ:

enter image description here

したがって、テキストテーブルのデータ:enter image description here

テキストを返しなければなりません 要求されました 言語の場合 存在します とテキスト デフォルト 言語がそうであれば 存在しない. 。でそれを行うことは可能ですか? 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がしていることを感じたい場合。スクリプトをアップロードしてテーブルを作成し、サンプルデータを挿入し、上記のコードを実行します 要点に.

かなりセクシーですよね?

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top