需要有关SQL查询的帮助

时间:2014-06-10 23:22:54

标签: sql-server tsql

以下是该方案:

我在SQL Server 2008数据库中有3个表 - SERVERSInstalledPatchesPatchlist

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

任何帮助都会非常感激。

感谢。

2 个答案:

答案 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