2017-09-14 95 views
0

錄音文本在表格(tbl_i18n):SQL - 回退到默認語言當翻譯用以下結構不存在在不同的語言

text_FK | language_FK | value 
----------------------------- 
    1 |  1  | hello 
    1 |  2  | hallo 
    2 |  1  | world 
    3 |  1  | test 

給人一種特定語言的文本(ID = 2)用簡單連接,如:

SELECT [value] FROM tbl_i18n i 
    JOIN tbl_products p ON p.text_id = i.text_FK 
    JOIN tbl_languages l ON l.id = i.language_FK AND i.language FK = 2; 

,其結果是:

value 
------- 
hallo 

怎能上述選擇聲明改變了,所以我們可以有我的默認語言和當翻譯的文本字段不存在他們的後備文字會顯示出來,並且結果將成爲:

value 
------- 
hallo 
world 
test 
+0

你能修改問題以便更好地理解嗎? – lostmylogin

+1

另外檢查這個問題,看看它是否有幫助https://stackoverflow.com/questions/3238651/retrieving-i18n-data-with-fallback-language?rq=1 – lostmylogin

+0

@lostmylogin,這裏我們有3個文本框和4記錄。英語3個,德語1個。你好字段有德文翻譯,但其他人不。我想用德語獲得所有領域,但是當沒有德語翻譯時,應該返回英文字段。 Tanx爲鏈接;看起來有希望 – dNitro

回答

1

LEFT JOIN語言表兩次。第一次爲通緝語言,第二次爲後備價值。如果可用,請使用COALESCE選擇想要的語言,否則使用備用語言。

SELECT coalesce(l1.[value], l2.[value]) 
FROM tbl_i18n i 
JOIN tbl_products p ON p.text_id = i.text_FK 
LEFT JOIN tbl_languages l1 ON l.id = i.language_FK AND i.language_FK = 2 
LEFT JOIN tbl_languages l2 ON l.id = i.language_FK AND i.language_FK = 1; 
+0

簡潔而精確。坦。 – dNitro

0

我想用簡單的英語,你想要的是最高可用language_FK每個text_FK

WITH X AS (
SELECT * 
    ,ROW_NUMBER() OVER (PARTITION BY text_FK ORDER BY language_FK DESC)rn 
FROM TableName 
) 
SELECT * 
FROM X 
WHERE X.rn = 1 
+0

在這裏,我只是簡單地使用了'int' id;其實我們使用'uniqueidentifier'作爲id;所以我不確定我們可以使用'ORDER BY'。 – dNitro