Подтвердить что ты не робот

SQL Server - объединение соединений OUTER и INNER

У меня есть 3 таблицы, и мне нужно внутреннее соединение таблицы A с таблицей B, но слева от таблицы A и таблицы C.

Можно ли объединить внешнее и внутреннее соединение в одном запросе? Я могу вложить запросы и достичь желаемого результата, но я не могу выполнить оба соединения в одном запросе. Похоже, что на других языках SQL важное значение имеет порядок присоединения. Это также относится к SQL Server?


Хорошо, вот сценарий.

Рассмотрим 3 таблицы. Таблица A, Таблица F, Таблица D.

Мне понадобится набор записей, чтобы содержать все строки в D независимо от того, существует ли он в F (после того, как он соединяется с A). Таким образом, приходит в голову внешнее соединение. Мне нужно:

  • Сначала сделайте внутреннее соединение между A и F, чтобы получить набор (это может быть нулевой набор)
  • Затем выполните внешнее соединение с набором записей в (1) с помощью D
4b9b3361

Ответ 1

Если я правильно понял, вы хотите что-то вроде этого:

select
    *
from
    a 
    left outer join c
        inner join b on c.bID = b.ID
    on a.cID = c.ID

Ответ 2

В моем случае мне нужно было добавить псевдонимы таблиц для моего запроса:

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 

Ответ 3

Конечно, вы можете сделать соединение в том же запросе: -

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

Ответ 5

Порядок не должен иметь значения.

Venn Diagram

Вот диаграмма Венна из Викисклада. Независимо от порядка запросов, вы получите перекрытие между кругами A и B с нулями для столбцов C, где C не перекрывает комбинацию A и B.

Ответ 6

От вашего наблюдения, похоже, вы хотите "условное" внутреннее соединение.

По существу, "Если 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 внутри представления, а затем вы можете ПОЛНОСТЬЮ ПРИСОЕДИНЯТЬСЯ к результатам.

Ответ 7

Да, вы можете сделать то же самое, и да, порядок важен.

Ответ 8

Проблема может быть не в конкретном соединении (Энтони показал вам, как делать то, что вы нам описали). Помните, что у людей часто возникают проблемы с использованием левых соединений, потому что они пытаются помещать что-то в предложение where, ссылаясь на таблицу справа сторона соединения, таким образом преобразуя его из внешнего соединения в внутреннее соединение (если вы не смотрите на те записи, где второе поле таблицы имеет значение null, которое дает вам записи в первой таблице, а не в секвой).

Мы могли бы помочь вам лучше, если бы мы произносили фактический код, который вы использовали, это wasn; t произвела желаемые результаты, а также некоторые образцы данных и результаты выборки.