2015-08-28 22 views
0

這些都是我的表:SQL查詢來獲取默認值,如果翻譯沒有找到

Product: 
ID PRICE NAME DESCRIPTION 
1 100 laptop laptop_desc 
2 200 mouse mouse_desc 

Product_Translations: 
PID LANG NAME DESCRIPTION 
1 ch 伊吾 伊吾伊吾 

請不要擔心名稱和描述在產品表。如果用戶選擇默認語言,我們會保留它以避免連接。

現在我需要編寫一個查詢根據用戶與後備,如果對於名稱和描述沒有翻譯在Product_Translations發現產品表讓他們的語言讓所有的產品從產品。我嘗試了幾種不同的方式,但無法使其工作。 更新:


我要求所有的產品表中的列(在這個例子中,我只給了2,但我的實際表具有更多的列)。還有一個限制是我需要使用JPA Criteria API來生成這個查詢,所以任何JPA不支持的SQL關鍵字都可能不適合我。

感謝您的幫助。

+0

'LEFT JOIN'是你的朋友。 – lad2025

+0

使用LEFT JOIN後,'COALESCE()'是你的下一個朋友。 –

+0

等一下......你在用什麼? MySQL,SQL Server,PlSQL? –

回答

0
SELECT p.ID, p.Price, 
     COALESCE(pt.Name, p.Name) Name, 
     COALESCE(pt.Description, p.Description) Description 
FROM Product p 
INNER JOIN User u on u.ID = @MyUserID 
LEFT JOIN Product_Translations pt ON pt.PID = p.ID AND pt.LANG = u.LANG 
+0

謝謝,COALECSE應該是COALESCE。我如何處理p。*,如果我不想單獨提到像p.Id和p.Price這樣的列名稱。 SELECT p。*, COALESCE(pt.name,p.name)name, COALESCE(pt.description,p.description)description FROM產品p LEFT JOIN產品_T pt ON pt.PID = p.ID和pt。 LANG ='ch'給出兩次名稱和描述。 – geekprogrammer

+0

'Select *'被高估了。 –

+0

也許,但在我的情況下,我需要選擇所有的列。在這個例子中,我簡單地給了id和價格。我的實際表格有很多列。無論如何要做? – geekprogrammer

0

使用LEFT OUTER JOIN:

SELECT 
     p.id 
    ,p.price 
    ,ISNULL(t.name, p.name) AS translation 
    ,ISNULL(t.description, p.description) AS description 
FROM Product p 
LEFT JOIN Translations t 
    ON p.id = t.pid 
    AND t.lang = ? 

這將SQL Server上工作,如果你使用其他數據庫的變化凝聚()。

+0

coalesce()也適用於sql server,那麼爲什麼還要使用其他任何東西? –

+1

COALESCE是語法糖對CASE在某些情況下是非確定性的+它根據所有表達式的類型優先級而不是第一個表達式評估其類型。它只有電源纔是ANSI標準的一部分,並支持多種輸入。 – lad2025

+0

您的查詢沒有給出默認值,我認爲最後一行應該是「AND t.lang =?」。還有一件事是我需要Product table中的所有列。 – geekprogrammer