重构SQL(解决方法RIGHT OUTER JOIN)

时间:2009-01-30 03:36:15

标签: sql sqlite refactoring outer-join

由于SQLite不支持RIGHT OUTER JOINS,我提出以下挑战(阅读:邀请我为我工作):

重构此查询,使其不再使用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获得电子拥抱

2 个答案:

答案 0 :(得分: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')

我认为这将为您提供匹配翻译文本的所有字符串,其中合适的翻译以英语存在。那是你想要得到的吗?

答案 1 :(得分:2)

有趣的是SQLite允许LEFT OUTER JOIN但不允许RIGHT OUTER JOIN。好吧,因为它确实允许LEFT 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建议命名连接表以使查询解析 - 希望它现在有效!]