以下是该方案:
我在SQL Server 2008数据库中有3个表 - SERVERS
,InstalledPatches
和Patchlist
。
SERVERS
表包含服务器列表。 InstalledPatches
包含安装在其上的服务器和修补程序列表。 Patchlist
包含应该在每台服务器上安装的所有补丁的列表。 PATCHLIST中的所有修补程序应理想地安装在SERVERS表中的所有服务器上。我试图找到缺少的补丁。
示例数据:
服务器
SERVERID SERVERNAME
-----------------------
1 ABC
.. ..
1500 XYZ
INSTALLEDPATCHES :
SERVERID PATCHID
-----------------
1 1
1 2
2 1
.. ..
1500 1
1500 2
PATCHLIST :
PATCHID PATCHNUMBER
---------------------
1 aaa
2 bbb
3 ccc
4 ddd
.. ..
15 ZZZ
最终报告应指出缺失的补丁:
SERVERID MissingPATCHID
-------------------------
1 3
1 4
1 1500
2 3
2 4
2 1500
..
我尝试使用以下查询,但无法找到每个服务器的所有缺失补丁。
SELECT
A.*
FROM
INSTALLEDPATCHES A
RIGHT OUTER JOIN
PATCHLIST B ON A.PATCHID = B.PATCHID
WHERE
A.PATCHID IS NULL
任何帮助都会非常感激。
感谢。
答案 0 :(得分:1)
怎么样?
select s.SERVERID,
pl.PATCHID MissingPATCHID
from SERVERS s
cross join PATCHLIST pl
where not exists (select SERVERID,
PATCHID
from INSTALLEDPATCHES ip
where ip.SERVERID = s.SERVERID
and ip.PATCHID = pl.PATCHID)
我刚创建了这个SQLFiddle demo。
答案 1 :(得分:0)
尝试我的查询。它现在有效。
select s.serverid, p1.patchid as MissingPatchID
from [servers] as s
left join patchlist as p1
on 1=1
left join installedpatches as p2
on s.serverid = p2.serverid
and p1.patchid = p2.patchid
where p2.patchid is null