Найти элементы из таблицы A, не включенные в таблицу B, которые связаны между собой таблицей C - PullRequest
0 голосов
/ 26 марта 2020

У меня есть три таблицы:

ProductionOrderRow, ProductionOrderRoutingRow и ProductionOrder

ProductionOrderRow содержит такие данные, как:

ProductionOrderRowId / Routing code
1                    / ZIP1 
1                    / MAGR1 
1                    / CSMK1 
1                    / TUFT1

Данные ProductionOrderRoutingRow, такие как:

ProductionOrderRoutingRowId / Routing code
1                           / ZIP1 
1                           / MAGR1 
1                           / CSMK1

ProductionOrder содержит такие данные, как:

ReferenceNumber / ProductionOrderRoutingRowId / ProductionOrderRowId

000001          / 1                           / 1

Я хочу найти весь код маршрутизации из ProductionOrderRow, которого нет в ProductionOrderRoutingRow. В моем примере это TUFT1. Но это не так просто:

Каждая запись ProductionOrder имеет внешний ключ ProductionOrderRow и ProductionOrderRoutingRow. Итак, что я хочу сделать:

  • Найти коды маршрутизации из ProductionOrderRow, которого нет в ProductionOrderRoutingRow в первой записи ProductionOrder
  • Найти коды маршрутизации из ProductionOrderRow, которого нет в ProductionOrderRoutingRow во второй записи ProductionOrder ... et c

Возможно ли это сделать?

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

(несколько неясная) структура SELECT... EXCEPT... может справиться с этим:

SELECT
   pr.ReferenceNumber
  ,por.RoutingCode
 from ProductionOrder  pr
  inner join ProductionOrderRow  por
   on por.ProductionOrderRowId = pr.ProductionOrderRowId
EXCEPT SELECT
   pr.ReferenceNumber
  ,porr.RoutingCode
 from ProductionOrder  pr
  inner join ProductionOrderRoutingRow  porr
   on porr.ProductionOrderRoutingRowId = pr.ProductionOrderRoutingRowId

Думайте об этом как:

  • первый "выбор" вытаскивает все Row RoutingCodes для всех ссылочных номеров
  • второй «выбор» вытаскивает все RoutingRow RoutingCodes для всех справочных номеров
  • , а «кроме» удаляет все предметы из второго набора, найденные в первом наборе
0 голосов
/ 26 марта 2020

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

select por.* 
from ProductionOrderRow por
where not exists (
    select 1
    from ProductionOrderRoutingRow porr
    inner join ProductionOrder po 
        on po.ProductionOrderRoutingRowId = porr.ProductionOrderRoutingRowId 
    where 
        po.ProductionOrderRowId = por.ProductionOrderRowId
        and porr.RoutingCode = por.RoutingCode  
)
...