SQL 查询问题(列中没有值的项目)

Mar*_*sky 6 t-sql select

这是我需要用一些 T-SQL Magic 解决的难题,我尝试过但失败了。

这是其中之一,在我想到实际解决方案之前,我认为我可以在 3 分钟内使用一些 T-SQL 解决,但是当“橡胶遇到道路”时,我无法在脑海中想象正确的运算符来实现这个逻辑。

我想知道 Stack Exchange 社区中是否有人可以找到一个优雅的解决方案。我想通过使用临时表或游标的 3 或 4 个查询的组合,我可以找到解决方案,但它不会基于 SET...

我有一张看起来像这样的桌子(或多或少......)

CREATE TABLE Computers (
   ID               int IDENTITY(1,1),
   ComputerName     varchar(255),
   OS               varchar(255),
   AppName          varchar(255),
   AppVersion       varchar(10)
)
Run Code Online (Sandbox Code Playgroud)

因此,每一行都有一个计算机名称、一个操作系统值(可以是 Windows 7 或 Windows 10),然后是应用程序的描述(例如 AppName = "Notepad++", AppVersion = "7.5.6")

ComputerName   | OS           | AppName   | AppVersion
Computer 1     | Windows 7    | App 1     | 1.0
Computer 1     | Windows 7    | App 2     | 1.0
Computer 1     | Windows 7    | App 3     | 1.0
Computer 2     | Windows 10   | App 4     | 1.0
Computer 2     | Windows 10   | App 5     | 1.0
Computer 3     | Windows 10   | App 4     | 1.0
Computer 4     | Windows 7    | App 4     | 1.0
Computer 4     | Windows 7    | App 5     | 1.0
Computer 5     | Windows 7    | App 1     | 1.0
Computer 5     | Windows 7    | App 4     | 1.0
Computer 5     | Windows 7    | App 5     | 1.0
Run Code Online (Sandbox Code Playgroud)

它的工作方式是这样的:如果一台计算机安装了 10 个应用程序,那么该表中将有 10 行(每个应用程序一个)。计算机名和操作系统将重复(请不要开始讨论第二范式......这严格来说是一个关于解决问题的查询的问题)。

因此,我需要解决的问题是:我需要找到操作系统为 Windows 7 的计算机列表(即 EAAAASY),但是...

只有在此表中针对该 PC 报告的所有应用程序都报告为在其他 Windows 10 计算机上使用时,这些计算机才应显示在我的列表中。

如果 Windows 7 计算机具有未在 Windows 10 计算机中列出的应用程序,则它们不应显示在此列表中。用于计算机的每个应用程序都必须符合此规则,计算机才有资格列入我的列表。

这个想法是要知道我在 SELECT 中获得的计算机具有我知道适用于 Windows 10 的所有应用程序,因此迁移它们应该更安全。

样本:

对于在家中尝试此操作的人,这里有一个 CREATE TABLE 和一些 INSERT,您对我的数据的外观有正确的了解

-- Create the table
 CREATE TABLE Computers (
    ComputerName    varchar(255),
    OS              varchar(255),
    AppName         varchar(255),
    AppVersion      varchar(10)
 )

 -- Insert some values...
 INSERT INTO Computers
 VALUES 
 ('Computer 1', 'Windows 7', 'App 1', '1.0'),
 ('Computer 1', 'Windows 7', 'App 2', '1.0'),
 ('Computer 1', 'Windows 7', 'App 3', '1.0'),
 ('Computer 2', 'Windows 10', 'App 4', '1.0'),
 ('Computer 2', 'Windows 10', 'App 5', '1.0'),
 ('Computer 3', 'Windows 10', 'App 4', '1.0'),
 ('Computer 4', 'Windows 7', 'App 4', '1.0'),
 ('Computer 4', 'Windows 7', 'App 5', '1.0'),
 ('Computer 5', 'Windows 7', 'App 1', '1.0'),
 ('Computer 5', 'Windows 7', 'App 4', '1.0'),
 ('Computer 5', 'Windows 7', 'App 5', '1.0')
Run Code Online (Sandbox Code Playgroud)
  • 在此示例中,唯一符合我的查询条件的计算机是计算机 4,也是唯一一台 Windows 7 计算机,其中所有与其关联的应用程序(应用程序 4 和 5)也至少存在于 Windows 10 PC 的一行中。

  • 计算机 5 不符合条件,因为与之关联的应用程序之一(“应用程序 1”)仅存在于另一台 Windows 7 计算机(计算机 1)上的此集中,因此我不能说此应用程序已经在 Windows 10 PC 上运行.

  • 计算机 2 和 3 是 Windows 10。所以应该足以丢弃它们......

  • 计算机 1 也不应该符合条件,他们的所有应用程序都没有在 Windows 10 PC 上运行。

希望有意义...

jya*_*yao 2

我相信以下查询将为您提供正确的计算机名称

 select ComputerName from dbo.computers
 where os= 'windows 7'
 except
 select ComputerName from dbo.computers
 where os= 'windows 7'
 and appname not in (select appname from dbo.computers where os='windows 10')
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述