postgreSQL查询显示哪些表项缺少另一个表中定义的行(异常报告)



使用postgres,我试图写一个查询,将告诉我哪些设备没有所有的访问列表条目定义在他们。

net_schema.acl_ssh定义了所有设备应该拥有的ACL表项的主列表:

<表类> addr tbody><<tr>10.10.10.1020.20.20.2030.30.30.30

我通常回避select distinct,但这似乎是一个合理的用例,如果有的话。

我有效地使用左连接来查找内部连接会失败的实体。

select distinct
i.hostname
from
net_inv.master i
cross join net_schema.acl_ssh s
left join net_config.acl a on
i.hostname = a.hostname and
s.addr = a.src_addr
where
a.hostname is null

对于一些背景/解释,这个查询为您提供了完整的输出,因此您可以看到为什么后面跟着distinct的where条件将其缩小到缺少的条目:

select *
from
net_inv.master i
cross join net_schema.acl_ssh s
left join net_config.acl a on
i.hostname = a.hostname and
s.addr = a.src_addr

我会用cross join吹出hostnamesrc_addr组合,然后使用except找到缺失的记录:

with needed as (
select m.hostname, 'ssh' as acl_id, s.addr as src_addr
from net_inv.master m
cross join net_schema.acl_ssh s
)
select hostname, acl_id, src_addr from net_schema.acl
except
select hostname, acl_id, src_addr from needed;

最新更新