Запрос SQL Inner Join, такой как LEFT OUTER JOIN

У меня проблема с внутренним соединением sql. Мои таблицы, столбцы, типы данных и значения таблиц на следующем изображении.

Мой рабочий запрос:

SELECT O.ORDER_ID, O.ORDER_DATE, O.QUANTITY, 
 P.PART_ID, P.PART_CODE, P.PART_NAME,
 C.CUST_ID, C.CUST_CODE, C.CUST_NAME
FROM (([dbo].[ORDER] O
LEFT OUTER JOIN [dbo].[CUSTOMER] C
 ON C.CUST_ID = O.CUST_ID)
LEFT OUTER JOIN [dbo].[PART] P
 ON P.PART_ID = O.PART_ID

и он возвращает, что

поэтому мой вопрос: я хочу написать запрос, как второе изображение, но я должен использовать INNER JOIN, который сделает левое внешнее соединение. Я написал следующий запрос для этого

SELECT DISTINCT *
FROM [dbo].[ORDER] O 
INNER JOIN CUSTOMER C
 ON (C.CUST_ID = O.CUST_ID OR
 O.CUST_ID IS NULL)

но он не возвращает результат запроса LEFT OUTER JOIN. Как я могу сделать это без использования LEFT OUTER JOIN?

2 ответа

Это зависит от намерения учителя. Если это вопрос языка, а не вопрос логического оператора, используйте OUTER APPLY:

SELECT O.*, D.*
FROM [dbo].[ORDER] O 
OUTER APPLY
(
 SELECT *
 FROM [dbo].CUSTOMER C
 WHERE C.CUST_ID = O.CUST_ID
) D


Простой ответ: вы не можете легко заменить левое соединение внутренним соединением и сохранить ту же функциональность. (И почему бы вам?)

Левое внешнее соединение позволяет вам присоединиться ко второй таблице, но сохранить первую запись таблицы, даже если совпадение во второй таблице не существует. Внутреннее соединение, с другой стороны, ограничивает ваши первые записи в таблице, так что отображаются только совпадения.

INNER JOIN CUSTOMER C ON (C.CUST_ID = O.CUST_ID OR O.CUST_ID IS NULL)

Здесь вы частично присоединяетесь к таблице CUSTOMER. Когда в таблице заказов содержится клиент, вы присоединяете соответствующую запись клиента к записи заказа. Когда в таблице заказов нет клиента, вы присоединяете всех клиентов к записи заказа.

Конечно, вы всегда можете обмануть. Добавьте нулевую запись на лету:

INNER JOIN 
(
 SELECT CUST_ID, CUST_CODE, CUST_NAME
 FROM CUSTOMER
 UNION ALL
 SELECT NULL, NULL, NULL
) C ON (C.CUST_ID = O.CUST_ID OR (C.CUST_ID IS NULL AND O.CUST_ID IS NULL))

Но как сказано: зачем вы это делаете, вместо того, чтобы использовать прямолинейный способ использования LEFT OUTER JOIN?

licensed under cc by-sa 3.0 with attribution.