Рефакторинг SQL (обходной путь RIGHT OUTER JOIN) - PullRequest
2 голосов
/ 30 января 2009

Поскольку SQLite не поддерживает ПРАВИЛЬНЫЕ НАРУЖНЫЕ СОЕДИНЕНИЯ, я ставлю следующую задачу (читай: приглашение сделать мою работу за меня):

Выполните рефакторинг этого запроса, чтобы он больше не использовал неподдерживаемые SQLite конструкции, такие как RIGHT / FULL OUTER JOINs.

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

Первый, кто взломает его, получает e-hug от dekz

Ответы [ 2 ]

3 голосов
/ 30 января 2009

Не проверено следующее.

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')

Я думаю, что это даст вам все строки с соответствующим текстом перевода, где подходящий перевод существует на английском языке. Это то, что вы пытаетесь получить?

2 голосов
/ 30 января 2009

Интересно, что SQLite допускает ЛЕВЫЕ ВНЕШНИЕ СОЕДИНЕНИЯ, но не ВПРАВО НАРУЖНЫЕ СОЕДИНЕНИЯ. Что ж, поскольку он допускает ЛЕВЫЕ ВНЕШНИЕ СОЕДИНЕНИЯ, вы правы, вы можете просто изменить порядок соединения:

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 об именовании объединенной таблицы, чтобы получить запрос на анализ - надеюсь, он работает сейчас!]

...