使用postgres,我试图写一个查询,将告诉我哪些设备没有所有的访问列表条目定义在他们。
表net_schema.acl_ssh
定义了所有设备应该拥有的ACL表项的主列表:
<表类>
addr
tbody><<tr>10.10.10.10 20.20.20.20 30.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
吹出hostname
和src_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;