Ответ 1
Если я правильно понял, вы хотите что-то вроде этого:
select
*
from
a
left outer join c
inner join b on c.bID = b.ID
on a.cID = c.ID
У меня есть 3 таблицы, и мне нужно внутреннее соединение таблицы A с таблицей B, но слева от таблицы A и таблицы C.
Можно ли объединить внешнее и внутреннее соединение в одном запросе? Я могу вложить запросы и достичь желаемого результата, но я не могу выполнить оба соединения в одном запросе. Похоже, что на других языках SQL важное значение имеет порядок присоединения. Это также относится к SQL Server?
Хорошо, вот сценарий.
Рассмотрим 3 таблицы. Таблица A, Таблица F, Таблица D.
Мне понадобится набор записей, чтобы содержать все строки в D независимо от того, существует ли он в F (после того, как он соединяется с A). Таким образом, приходит в голову внешнее соединение. Мне нужно:
Если я правильно понял, вы хотите что-то вроде этого:
select
*
from
a
left outer join c
inner join b on c.bID = b.ID
on a.cID = c.ID
В моем случае мне нужно было добавить псевдонимы таблиц для моего запроса:
SELECT * FROM ("purchased_items" p1
INNER JOIN "purchase_orders" po1 ON (po1."id" = p1."purchase_order_id")) AS p4
LEFT OUTER JOIN (purchased_items p2
INNER JOIN "purchase_orders" po2 ON (po2."id" = p2."purchase_order_id")) AS p5
ON (p4.item_variant_id = p5.item_variant_id AND p4.delivery_date < p5.delivery_date)
WHERE p5.delivery_date IS NULL AND p4.delivered <> 0
Конечно, вы можете сделать соединение в том же запросе: -
FROM TableA a
INNER JOIN Table b ON a.TableA_ID = b.TableA_ID
LEFT OUTER JOIN Table c ON a.TableA_ID = c.TableA_ID
Вы можете использовать как внутренние, так и внешние соединения в одном запросе, но их порядок важен. См. Этот вопрос:
Внутреннее соединение и внешнее соединение; это порядок таблиц из важных?
Порядок не должен иметь значения.
Вот диаграмма Венна из Викисклада. Независимо от порядка запросов, вы получите перекрытие между кругами A и B с нулями для столбцов C, где C не перекрывает комбинацию A и B.
От вашего наблюдения, похоже, вы хотите "условное" внутреннее соединение.
По существу, "Если A и B имеют запись, INNER JOIN to C".
Однако, скорее всего, вы столкнулись с проблемой, когда INNER JOIN в вашем запросе не показывает записи, где A не имеет записей, связанных с B или C. Если они находятся в одной и той же области видимости, INNERS всегда будут работать, вы не можете условно их запустить в соответствии с их порядком.
Вам либо нужно использовать два LEFT-соединения, либо отфильтровать записи, которые вам не нужны, или альтернативно использовать View для области INNER JOIN.
Ex. LEFT JOIN vw_MyView ON A.ID = vw_MyView.A_ID
Где MyView имеет таблицы B и C со своим INNER JOIN. Это позволит запустить INNER JOIN внутри представления, а затем вы можете ПОЛНОСТЬЮ ПРИСОЕДИНЯТЬСЯ к результатам.
Да, вы можете сделать то же самое, и да, порядок важен.
Проблема может быть не в конкретном соединении (Энтони показал вам, как делать то, что вы нам описали). Помните, что у людей часто возникают проблемы с использованием левых соединений, потому что они пытаются помещать что-то в предложение where, ссылаясь на таблицу справа сторона соединения, таким образом преобразуя его из внешнего соединения в внутреннее соединение (если вы не смотрите на те записи, где второе поле таблицы имеет значение null, которое дает вам записи в первой таблице, а не в секвой).
Мы могли бы помочь вам лучше, если бы мы произносили фактический код, который вы использовали, это wasn; t произвела желаемые результаты, а также некоторые образцы данных и результаты выборки.