2017-07-30 116 views
2

我有3代表爲初級講座:如何查詢表,以獲取其鏈路記錄中沒有任何記錄,並有過濾記錄,以及

 
translation_token 
----------------- 
id token default_value 
-- ------ ------------- 
1 token_1 Token 1 
2 token_2 Token 2 
3 token_3 Token 3 

translation_token_value 
----------------------- 
id token_id language_id value 
-- -------- ----------- ----- 
1 1    1  Token 1 english 
2 1    2  Token 1 dutch 
3 2    1  Token 2 english 

application_module 
------------------ 
id name 
-- ---- 
1 project 
2 location 


LI_translation_token_application_module 
--------------------------------------- 
id token_id application_module_id 
-- -------- --------------------- 
1  1    1   
2  2    2   

我已經translation_token表,如果有翻譯適用於特定的語言,然後它條目將存在於translation_token_value表中,否則default_translation將被取回爲令牌並且不爲null。

此外,這些令牌既可用於特定模塊,也可用於所有模塊。如果這些令牌用於模塊,那麼LI_translation_token_application_module表中將存在鏈接,否則不會有任何條目。

獲取記錄時,我總是有模塊和language_id用於過濾器,以便我可以獲取特定模塊和語言的翻譯以及一般翻譯,即適用於所有模塊的令牌。

到目前爲止,我嘗試了下面的查詢,但沒有得到成功。我沒有獲得在translation_token_value中沒有翻譯的標記,因此對於此標記default_translation將是可見的。

SELECT translation_token.token, ttv.value, 
CASE WHEN ttv.value = NULL THEN translation_token.default_translation 
     ELSE ttv.value 
END 
FROM translation_token 
LEFT OUTER JOIN translation_token_value AS ttv ON ttv.token_id = translation_token.id 
LEFT OUTER JOIN LI_translation_token_application_module AS token_app_mod ON token_app_mod.token_id = ttv.token_id 
LEFT JOIN application_module 
ON application_module.id = token_app_mod.application_module_id 
WHERE (application_module.name IN('project') OR application_module.name IS NULL) 
AND (language_id = 2 OR language_id is null) 

回答

2

您在左問題「LI_translation_token_application_mod」使用默認的符號表「translation_token」沒有令牌值表「translation_token_value」加入。像下面

SELECT translation_token.token, ttv.value, 
CASE WHEN ttv.value Is NULL THEN translation_token.default_translation 
    ELSE ttv.value 
END 
FROM translation_token 
LEFT OUTER JOIN translation_token_value AS ttv ON ttv.token_id = translation_token.id and ttv.language_id=2 
LEFT OUTER JOIN LI_translation_token_application_module AS token_app_mod ON token_app_mod.token_id = translation_token.token_id 
LEFT JOIN application_module 
ON application_module.id = token_app_mod.application_module_id 
WHERE (application_module.name IN('project') OR application_module.name IS NULL) 
+0

你也需要改變'WHEN ttv.value = NULL'到'WHEN ttv.value IS NULL' – Alex

+0

心中已經編輯查找我的錯誤查詢感謝@Alex –

+0

@EidMorsy感謝。但是這只是解決了在LI表中不存在令牌的問題。如果任何語言的translation_token_value表中沒有令牌記錄,則此查詢仍然不起作用。 – Kammy

相關問題