2014-09-30 36 views
0

很抱歉的混亂標題,更好地直奔代碼相同的查詢:多選擇在其中互相覆蓋,其他的結果

樣品表:

|  key | value | MainLanguage  |  SubLanguage  | 
| mLangID |  5 |  default  |   en   | 
| mLangID |  3 |   esES  |   en   | 
| mTitle | Title |  default  |   en   | 
| mTitle | Título |   esES  |   es   | 

我想避免使用這些查詢:

SELECT * FROM translation.strings WHERE MainLanguage = 'esES' AND lang='es' 
SELECT * FROM translation.strings WHERE MainLanguage = 'esES' AND lang='en' 
SELECT * FROM translation.strings WHERE MainLanguage = 'default' AND lang='en' 
... 

並將它們組合成一個,但要確保第一次查詢的結果將不被第二個結果會被覆蓋,等等。或者,如果它更容易,反向(第二查詢改寫第一查詢的結果,第3覆蓋第二查詢等)

+0

'UNION' /'UNION ALL' – serakfalcon 2014-09-30 12:17:16

回答

0

如果我理解正確的話,你想union allwhere子句的結果優先級。我猜你想要每key一行。如果是這樣,這可能工作

SELECT * 
FROM translation.strings s 
WHERE MainLanguage = 'esES' AND lang = 'es' 
UNION ALL 
SELECT * 
FROM translation.strings s 
WHERE MainLanguage = 'esES' AND lang = 'en' AND 
     NOT EXISTS (select 1 
        from translation.strings s2 
        where s2.key = s.key and s2.MainLanguage = 'esES' AND s2.lang = 'es' 
       ) 
UNION ALL 
SELECT * 
FROM translation.strings s 
WHERE MainLanguage = 'default' AND lang = 'en' AND 
     NOT EXISTS (select 1 
        from translation.strings s2 
        where s2.key = s.key and 
         (s2.MainLanguage = 'esES' AND s2.lang = 'es' or 
         s2.MainLanguage = 'esES' AND s2.lang='en' 
         ) 
       ); 

作爲一個說明:有更簡單的方法來解決在其他數據庫中。

1

使用UNION ALL結合的結果,這將不會刪除重複的行。