2009-08-04 119 views
4

我想知道如何將中使用的OR子句中的最左邊條件的結果返回,如果兩者都評估爲trueLEFT JOIN using OR

我到目前爲止所使用的解決方案均涉及在SELECT中使用CASE聲明,這意味着我會放棄OR子句。

另一種解決方案涉及在ORDER BY中使用CASE語句。

是否有任何其他解決方案可以減少使用CASE語句。我想問的原因是因爲現在只有兩個LEFT JOIN s,但隨着時間的推移會增加更多。

SELECT item.id, 
     item.part_number, 
     lang.data AS name, 
     lang2.data AS description 
    FROM item 
     LEFT JOIN 
     language lang 
      ON  item.id = lang.item 
      AND (lang.language = 'fr' OR lang.language = 'en') 
     LEFT JOIN 
     language lang2 
      ON  item.id = lang2.item 
      AND (lang2.language = 'fr' OR lang2.language = 'en') 
WHERE item.part_number = '34KM003KL' 
+0

我不明白您的查詢...... lang.data和lang2.data總是會返回同樣的事情。 – Martin 2009-08-04 16:03:53

+0

你爲什麼要用相同的連接標準加入語言兩次? – 2009-08-04 16:05:26

+0

對不起,我沒有在樣本聲明中加入'lang.type'。它應該是lang.type ='NAME'和lang2.type ='DESCRIPTION' – Andre 2009-08-04 16:29:16

回答

7

看來想要一個法國人的描述,如果它存在,否則退回到英語。

SELECT item.id, 
     COALESCE(
     (
     SELECT lang.data 
     FROM language l 
     WHERE l.item = i.id 
       AND l.language = 'fr' 
     ), 
     (
     SELECT lang.data 
     FROM language l 
     WHERE l.item = i.id 
       AND l.language = 'en' 
     ) 
     ) AS description 
FROM item i 

,或者這樣的:

SELECT item.id, 
     COALESCE(lfr.data, len.data) 
FROM item i 
LEFT JOIN 
     language lfr 
ON  lfr.item = i.id 
     AND lfr.language = 'fr' 
LEFT JOIN 
     language len 
ON  len.item = i.id 
     AND len.language = 'en' 

第一個查詢是更有效的,如果發現法語描述的概率高(如果第一個成功它不會評估第二子查詢)。

SQL ServerOraclePostgreSQL這事實上如果你有很多法國人描述的更高效:

SELECT item.id, 
     COALESCE(
     lfr.data, 
     (
     SELECT lang.data 
     FROM language l 
     WHERE l.item = i.id 
       AND l.language = 'en' 
     ) 
     ) AS description 
FROM item i 
LEFT JOIN 
     language lfr 
ON  lfr.item = i.id 
     AND lfr.language = 'fr' 

此查詢將使用的有效方法(HASH JOINMERGE JOIN)加入法國的描述,以及只有在必要時纔會回到英文版。

對於MySQL1st3rd查詢沒有區別。

在所有系統上創建language (item, language)

2

你可以改變多個厄爾斯使用IN子句,而不是...

SELECT i.id, i.part_number, L1.data name, L2.data description 
FROM item i 
    LEFT JOIN language L1 ON i.id = L1.item 
     AND L1.language In ('fr', 'en') 
    LEFT JOIN language L2 ON i.id = L2.item 
     AND L2.language In ('fr', 'en') 
WHERE i.part_number = '34KM003KL' 
0

一個綜合指數也許你想是這樣的:

SELECT item.id, item.part_number, COALESCE (lang.data, lang2.data) AS description 
FROM item AS item 
LEFT JOIN language AS lang ON item.id = lang.item AND lang.language = 'fr' 
LEFT JOIN language AS lang2 ON item.id = lang2.item AND lang2.language = 'en' 
WHERE item.part_number = '34KM003KL' 

如果法語和英語存在,或者只是法國人的存在,將返回法國數據。

0

如果你想法語翻譯,如果它存在,而英語作爲第二手的choise,您可以爲每種語言一次參加語言表:

select 
    item.id, item.part_number, isnull(fr.data, en.data) as name 
from 
    item 
    left join language fr on fr.item = item.id and fr.language = 'fr' 
    left join language en on en.item = item.id and en.language = 'en' 
where 
    item.part_number = '34KM003KL' 
0

爲什麼你不只是做你的標準, WHERE子句?

SELECT item.id, item.part_number, lang.data AS name, lang2.data AS description 
    FROM item AS item 
    LEFT JOIN language AS lang ON item.id = lang.item 
    LEFT JOIN language AS lang2 ON item.id = lang2.item 
    WHERE item.part_number = '34KM003KL' 
     AND (lang.language = 'fr' OR lang.language = 'en') 
     AND (lang2.language = 'fr' OR lang2.language = 'en')