选择至少具有与合同要求相同的批准代码的供应商

Selecting suppliers that have at least the same approval codes as the contract requires

有 table 的供应商 'approval codes' (VNDAPP) 和 table 的合同 'requirement codes' (COXA)。合同可以有任意数量的要求,供应商可以有任意数量的批准。

VNDAPP: (vendor approvals table)
VNUM    (vendor number)
REQMT   (approval code)

COXA:   (contract requirements table)
CONTR   (contract number)
REQMT   (requirement)

需要找到所有获得批准的供应商,这些供应商至少满足特定合同的要求。

示例合同 7736 具有编号 1 和 10 的要求。有 27 家供应商至少具有这两个要求。由于需求是可变的,我不能将它们硬编码到查询中。我不确定这是否属于关系除法问题...

SELECT VNDNO
FROM VNDAPP
LEFT JOIN COXA ON VNDAPP.REQMT = COXA.REQMT
GROUP BY VNDAPP.VNDNO
HAVING Count(COXA.REQMT) = (SELECT count(*)
FROM COXA WHERE COXA.CONTR = '7736'
GROUP BY COXA.CONTR)

我做错了什么??

提前致谢!

示例数据:

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  

假设您有两个绑定表 supplier_approval(supplierid, approvalid)contracts_requirement(contractid, requirementid),其中 approvalidrequirementid 对应。然后你可以使用下面的查询

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
)

我想你只是想要:

SELECT VNDNO
FROM VNDAPP JOIN
     COXA
     ON VNDAPP.REQMT = COXA.REQMT
WHERE COXA.CONTR = '7736'
GROUP BY VNDAPP.VNDNO
HAVING Count(*) = (SELECT count(*)
                   FROM COXA
                   WHERE COXA.CONTR = '7736'
                  );

即统计对供应商的要求与合同的要求相匹配。然后,检查总数是否与合同总数相符。

这假定您在任何一方都没有重复的要求。