Pregunta

Tengo tablas: introducir descripción de la imagen aquí

y lo que los datos en la tabla de idioma:

introducir descripción de la imagen aquí

y lo que los datos en la tabla Texto: introducir descripción de la imagen aquí

Tengo que volver texto para requerida idioma si existe y el texto para por defecto idioma si lo hace no existe . ¿Es posible hacer eso en un query (sin while, por favor)?

Código:

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

Gracias.

AÑADIDO:

Si el código solicita un texto en 'ua' (Ucrania) y esto no es cualquier texto para esta lengua, por lo que se va a buscar el texto de ruso. si se encuentra - está bien, si no lo hace va a buscar un texto de Inglés. Lista de idiomas puede variar.

¿Fue útil?

Solución

El uso de un CTE recursiva, esta consulta crea una tabla de todas las lenguas de ese punto en alguna parte de su cadena de valor predeterminado a un lenguaje que tiene el comentario requerida. Se muestra cada idioma junto a su primer defecto que tiene el comentario requerida. Se filtra entonces esta tabla para darle el primer texto disponible para el idioma seleccionado.

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
;

Trate sólo corriendo

SELECT *
FROM languages;

si quieres tener una idea de lo que el CTE recursiva está haciendo. He subido un script para crear las tablas, insertar algunos datos de la muestra, y ejecutar el código anterior a lo esencial .

bastante atractivo, no?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top