2009-01-30 43 views
2

由於SQLite不支持的右外連接我提出以下的挑戰(讀:邀請做我的工作對我來說):重構SQL(解決方法RIGHT OUTER JOIN)

重構該查詢,使其不再利用SQLite-不受支持的構造如RIGHT/FULL OUTER JOIN。

SELECT  strings.*, translations.text 
FROM   translations INNER JOIN 
         language ON translations.language_id = language.id RIGHT OUTER JOIN 
         strings ON translations.string_id = strings.id 
WHERE  (language.handle = 'english') 

我感覺它可以與子查詢或旋轉表和執行LEFT OUTER JOIN,但我的嘗試都失敗了實現;我的SQL不像過去那樣。

這裏的顯示應用模式的查詢生成器概述:http://dl.getdropbox.com/u/264612/sql-refactor.PNG

首先破解它得到一封來自擁抱dekz

+0

它應該返回的一個例子將幫助你找到一個很好的方法。 – GregD 2009-01-30 04:00:56

回答

3

以下是未經測試。

select strings.*, translations.text 
from strings left outer join translations 
    on translations.string_id = strings.id 
      and translations.language_id = (select id 
              from language 
              where language.handle = 'english') 

我認爲這會給你帶有匹配翻譯文本的所有字符串,其中英文中存在合適的翻譯。那是你想要得到的嗎?

+0

乾杯。這工作真棒,雖然我想知道是否可以做到沒有在j_random_hacker的方法中的子查詢。 – user60475 2009-01-30 05:07:44

+0

在這種情況下,子查詢可能會比另一個連接更快,因爲它只需要執行一次。如果SQLLite可以,它會保留它。 – Blorgbeard 2009-01-30 12:19:25

2

有趣的是,SQLite允許LEFT OUTER JOIN而不是RIGHT OUTER JOIN。那麼,既然它允許左外連接,你是對的,你可以重新連接順序:

SELECT  strings.*, translations.text 
FROM strings LEFT OUTER JOIN (
    translations INNER JOIN language ON translations.language_id = language.id 
) tr ON tr.string_id = strings.id 
WHERE  (language.handle = 'english') 

[編輯:命名連接表的應用Blorgbeard的建議,得到查詢解析 - 希望它現在可以運作!]