Sql server 需要有关SQL查询的帮助吗

Sql server 需要有关SQL查询的帮助吗,sql-server,tsql,Sql Server,Tsql,以下是场景: 我在SQL Server 2008数据库中有3个表-服务器、已安装补丁和补丁列表 SERVERS表包含服务器列表InstalledPatches包含安装在其上的服务器和修补程序的列表修补程序列表包含应安装在每台服务器上的所有修补程序的列表。补丁列表中的所有补丁最好安装在servers表中的所有服务器上。我正在努力寻找缺失的补丁 样本数据: 服务器 SERVERID SERVERNAME ----------------------- 1 ABC

以下是场景:

我在SQL Server 2008数据库中有3个表-
服务器
已安装补丁
补丁列表

SERVERS
表包含服务器列表
InstalledPatches
包含安装在其上的服务器和修补程序的列表<代码>修补程序列表包含应安装在每台服务器上的所有修补程序的列表。补丁列表中的所有补丁最好安装在servers表中的所有服务器上。我正在努力寻找缺失的补丁

样本数据:

服务器

SERVERID     SERVERNAME
----------------------- 
     1        ABC
    ..        ..
  1500        XYZ
已安装的修补程序

  SERVERID  PATCHID
  -----------------
       1        1
       1        2
       2        1
      ..       ..
    1500        1
    1500        2
PATCHID   PATCHNUMBER
---------------------
     1    aaa
     2    bbb
     3    ccc
     4    ddd
    ..    ..
    15    ZZZ
补丁列表

  SERVERID  PATCHID
  -----------------
       1        1
       1        2
       2        1
      ..       ..
    1500        1
    1500        2
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
任何帮助都将不胜感激


谢谢。

像这样的东西怎么样

   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)

我刚刚创建了这个。

试试我的查询。现在可以了

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

谢谢你,穆西奥。工作完美!!因为存在交叉连接,我认为大型表的性能不会很好,但我怀疑您没有大量(数百万?)的服务器或补丁:)@mucio-谢谢您的回答。你能告诉我我的回答是否也可以吗。有什么问题吗?@mucio-我在你的查询中发现一个错误。你能帮我一下吗?一个非布尔类型的表达式,在“,”附近的预期条件的上下文中指定。谢谢,穆西奥,看来我说得太快了。上面的查询给出了SQL.Borat中的语法错误,唯一的问题是它不会返回少数服务器上存在的补丁,但不会返回其他服务器上的补丁。示例表数据:#SERVERS serverid---------a b#INSTALLEDPATCHES serverid patchid----------a 1 a 2 b 1 a 4#PATCHLIST patchid----------1 2 3 4查询输出:serverid MissingPatch----------a 3 b 3缺失数据:serverid MissingPatch----------b4@Akshay - 我不能理解。请告诉我更多细节。我已经创建了一个SQLFIDLE演示()@BoratSagdiyev如果服务器未与任何修补程序关联,则此查询无法正常工作。@Akshay-我的坏消息。忘了在服务器上添加加入条件。它现在工作正常了。@mucio-谢谢你的回答和帮助。我喜欢你。