SQL Join, который возвращает только те записи, которые отсутствуют в другой таблице - PullRequest
0 голосов
/ 03 мая 2020

Рассмотрим две таблицы в SQL базе данных сервера:

Заказ

OrderId | OrderType | etc...

Отгрузка

ShipmentId | OrderId | ShipType | etc..

Я пытаюсь написать оператор выбора, который возвращает OrderId s:

where Order.OrderType = 'EXCHANGE' 

, и в таблице Shipment нет соответствующей записи с

Shipment.OrderId = Order.OrderId and Shipment.ShipType = 'BOX'

Причина этого заключается в том, что в зависимости от OrderType, BOX может или не может быть отправлен клиенту. Я хочу получить все идентификаторы заказа, которые имеют OrderType = 'EXCHANGE', но не имеют соответствующей отправки BOX, поэтому их можно переслать для отправки.

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Вы можете использовать not exists:

select o.*
from order o
where o.OrderType = 'EXCHANGE' and
      not exists (select 1
                  from shipment s
                  where s.OrderId = o.OrderId and s.ShipType = 'BOX'
                 );

Примечание. Как написано, это не сработает, потому что order - это ключевое слово SQL и зарезервированное слово, что делает его очень плохим выбором. имени таблицы (вы можете избежать имени, хотя вы не в вопросе). Я бы посоветовал вам назвать это как-то еще, например orders.

0 голосов
/ 03 мая 2020

Вы можете использовать LEFT JOIN.

SELECT
    o.*
FROM Order o
    LEFT JOIN Shipment s ON s.OrderId = o.OrderId AND s.ShipType = 'BOX'
WHERE
    o.OrderType = 'EXCHANGE'
    AND s.ShipmentId IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...