Sql 在集合中查找缺少的子集

Sql 在集合中查找缺少的子集,sql,postgresql,set,Sql,Postgresql,Set,我有三张桌子: cert sct server ======== ========= ============ cert_id cert_id serv_id pem serv_id url date_added load type 基本上,每次我获得一个新的证书(表cert),我都会将它提交到不同的服务器(在表server中进行时间戳),并将响应保存在表sct中。出于某

我有三张桌子:

cert         sct           server
========    =========    ============
cert_id     cert_id        serv_id
pem         serv_id        url
date_added  load           
type
基本上,每次我获得一个新的证书(表
cert
),我都会将它提交到不同的服务器(在表
server
中进行时间戳),并将响应保存在表
sct
中。出于某种原因,我可能有一些证书没有提交

此外,只能提交类型为
sign
的证书。 所以我需要重新提交

为此,我需要查找尚未提交到特定服务器的证书

cert
======
cert_id       pem      date_added      type
--------------------------------------------
idCert1      (data)      (date)        sign
idCert2      (data)      (date)        email
idCert3      (data)      (date)        sign
idCert4      (data)      (date)        sign
idCert5      (data)      (date)        email


sct
====
cert_id        serv_id         load
------------------------------------
idCert1        serv1           (data)
idCert1        serv2           (data)
idCert3        serv1           (data)

server
======
serv_id       url
--------------------
serv1         url1
serv2         url2
假设这些记录,我希望得到以下结果:

cert_id     pem      serv_id         url
-----------------------------------------
idCert3     (data)   serv2           URL2
idCert4     (data)   serv1           URL1
idCert4     (data)   serv2           URL2
到目前为止,我所能做的就是:

SELECT * 
FROM cert 
WHERE type='sign' 
AND cert_id NOT IN (SELECT cert_id 
                    FROM sct 
                    GROUP BY cert_id 
                    HAVING COUNT(cert_id)>=nbr_srv );
其中,
nbr\u srv
是表
server
中的服务器总数。该查询仅提供尚未提交到所有服务器的证书。 我不知道是否可以通过一个查询得到我想要的。

在所有可能的服务器/证书组合上生成交叉连接,并删除实际存在的组合:

SELECT
    *
FROM
    cert c
CROSS JOIN serv s
WHERE c.type = 'sign' AND (c.id, s.id) NOT IN (
    SELECT
        cert_id, serv_id
    FROM
        sct sc
)