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
)