这是我需要用一些 T-SQL 魔法解决的难题,我尝试过但失败了。
这是其中之一,在我想到实际解决方案之前,我认为我可以使用一些 T-SQL 在 3 分钟内解决,但是当“橡胶遇到道路”时,我只是无法在脑海中描绘出正确的运算符实现这个逻辑。
我想知道 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)
)
因此,每一行都有一个计算机名称、一个操作系统值(可以是 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
它的工作方式是这样的:如果一台计算机安装了 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')
在这个例子中,唯一符合我的查询条件的计算机是计算机 4,这是唯一一台 Windows 7 计算机,其中所有与之关联的应用程序(应用程序 4 和 5)也至少存在于 Windows 10 PC 的一行中。
计算机 5 不符合条件,因为与之关联的其中一个应用程序(“应用程序 1”)仅存在于另一台 Windows 7 计算机(计算机 1)上的此集合中,因此我不能说此应用程序已经在 Windows 10 PC 上运行.
计算机 2 和 3 是 Windows 10。所以这应该足以丢弃它们....
计算机 1 也不应该符合条件,他们的所有应用程序都没有在 Windows 10 PC 上运行。
希望有道理...
我相信以下查询将为您提供正确的计算机名称
结果是:
另一种方法