T- SQL Как выбрать все элементы без отношения в ситуации «многие ко многим»? - PullRequest
0 голосов
/ 18 апреля 2020

Допустим, есть 3 таблицы:

enter image description here

Как я могу показать, какой CustomerId не сделал заказ для конкретного SupplierId

Например: SupplierId 2 не получил заказы от CustomerId 1 и 5

До сих пор моя идея состоит в том, чтобы создать таблицу всех возможных комбинаций CustomerId / SupplierId и строк, которые соответствуют в таблице Orders. Есть ли лучший способ?

1 Ответ

1 голос
/ 18 апреля 2020

Вы можете cross join две ссылочные таблицы, чтобы сгенерировать все возможные комбинации, и использовать not exists для фильтрации по тем, которые не существуют в таблице мостов:

select c.customerId, s.supplierId
from customers c
cross join suppliers s
where not exists (
    select 1 
    from orders o 
    where o.customerId = c.customerId and o.supplierId = s.supplierId
)

Вы также можете сделать это с анти- left join:

select c.customerId, s.supplierId
from customers c
cross join suppliers s
left join orders o  
    on o.customerId = c.customerId and o.supplierId = s.supplierId
where o.customerId is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...