Select 每个合同的供应商都具有合同要求的所有代码

Select suppliers for each contract that have all codes required by the contract

我有 table 份合同 "requirement codes" (COXA) 和 table 份供应商 "approval codes" (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
)  

问题是我需要为每个合同编号匹配供应商。

提前致谢!

您可以使用 joingroup 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(*)

您可以使用 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)