Мне действительно нужна помощь, чтобы получить правильный запрос.Я не могу поделиться реальными именами таблиц и столбцов, но постараюсь сделать все возможное, чтобы решить проблему просто.
Предположим, что следующие таблицы.Таблицы и ключи НЕ МОГУТ быть изменены.Период.Мне все равно, если вы считаете, что это плохой дизайн, этот вопрос не является вопросом дизайна, он связан с синтаксисом SQL.
- Таблица A - Первичный ключ с именем id1
- ТаблицаB - Содержит два внешних ключа, TableA.id1 и Foo.id2 (игнорируйте Foo, это не имеет значения)
- Таблица C - Содержит два внешних ключа, TableA.id1 и Foo.id2, дополнительные интересныестолбцы.
Ограничения:
- SQL получает набор идентификаторов, переданных в качестве аргумента.
- Он должен возвращать список строк таблицы C.
- Он должен возвращать только строки таблицы C, в которых существует строка таблицы B с совпадающими таблицами TableA.id1 и Foo.id2 - есть строки ARE вТаблица C, которая не соответствует Таблице B
- Строка ДОЛЖНА быть возвращена для каждого переданного идентификатора id1, даже если строки таблицы C. не существует.
Сначала я попытался использовать Left Outer.Соединение из Таблицы A в Таблицу B, а затем Внутреннее Соединение с Таблицей C. Это нарушает 4-е правило, приведенное выше, так как Внутреннее Объединение исключает эти строки.
Далее я попробовал два соединения Left Outer.Это ближе, но имеет побочный эффект от включения строк, которые соответствуют соединению таблицы A с таблицей B, но не имеют соответствующей записи таблицы C, а это не то, что мне нужно.
Итак, вотто, что я придумала.
SELECT
a.id1,
c.*
FROM
TableB b
INNER JOIN
TableC c USING (id1,id2)
RIGHT OUTER JOIN
TableA a USING (id1)
WHERE
a.id1 in (x,y,z)
Я немного настороженно отношусь к правому внешнему соединению, поскольку прочитанная документация говорит, что его можно заменить левым внешним, но он не появляетсятак для этого случая.Это также кажется немного редким, что заставляет других разработчиков нервничать, поэтому я осторожен.
Итак, три вопроса в одном.
- Это правильно?
- Правильно ли я использовал правильное внешнее объединение?
- Есть ли более чистый способ добиться того же?
РЕДАКТИРОВАТЬ: DB - это MySQL