Выберите поставщиков для каждого контракта, которые имеют все коды, требуемые контрактом - PullRequest
0 голосов
/ 02 января 2019

У меня есть таблица контрактов с «кодами требований» (COXA) и таблица поставщиков с «кодами одобрения» (VNDAPP). Контракты могут иметь любое количество требований, а поставщики могут иметь любое количество разрешений.

Пример данных:

Contract Requirement (COXA):
CONTR   REQMT
7736    1
7736    10
7737    1
7737    4
7737    6
7738    5
7739    1

Supplier Approval (VNDAPP):
VNDNO   REQMT
10019   1
10020   1
10020   2
10020   10
10021   1
10021   4
10021   5
10021   6

Desired Result:
CONTR   VNDNO
7736    10020
7737    10021
7738    10021
7739    10019
7739    10020
7739    10021  

В другом вопросе Я получил ответ, который работает, когда я указываю номер контракта в запросе:

select sa.supplierid
from supplier_approval sa
    where sa.approvalid IN (
    select cr.requirementid
    from contracts_requirement cr
    where cr.contractid = 7736
 )
group by sa.supplierid
having count(distinct sa.approvalid) = (
    select count(*)
    from contracts_requirement cr
    where cr.contractid = 7736
)  

Проблема в том, что мне нужно иметь подходящих поставщиков для каждого номера контракта.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Вы можете использовать CROSS JOIN для генерации кортежей (контракты, поставщики, требования контракта), а затем использовать LEFT JOIN для сопоставления требований контракта с утверждениями поставщика:

SELECT
    contract_requirement.contr,
    suppliers.vndno,
    COUNT(contract_requirement.reqmt) AS req_count,
    COUNT(supplier_approval.reqmt) AS app_count
FROM contract_requirement
CROSS JOIN (
    SELECT DISTINCT vndno
    FROM supplier_approval
) AS suppliers
LEFT JOIN supplier_approval ON suppliers.vndno = supplier_approval.vndno AND contract_requirement.reqmt = supplier_approval.reqmt
GROUP BY contract_requirement.contr, suppliers.vndno
HAVING COUNT(contract_requirement.reqmt) = COUNT(supplier_approval.reqmt)
0 голосов
/ 02 января 2019

Вы можете использовать join и group by, а затем having, чтобы убедиться, что у вас есть все требования:

select cr.contr
from (select cr.*, count(*) over (partition by cr.contr) as cnt
      from contract_requirement cr 
     ) cr join
     supplier_approval sa
     on sa.approvalid = cr.requirementid
group by cr.contr, cr.cnt
having cr.cnt = count(*)
...