我需要一点SQL查询帮助(SQL Server 2012)。
我编写了一个脚本,用于计算存储在多个服务器上的一组文件的SHA256,并将其存储在带有列的数据库表中:
表格中的一些示例行:
SRVDB001, Address.xsd, CF4658A...F674
SRVDB002, Address.xsd, CF4658A...F674
SRVDB001, Company.xsd, BE6E5C3...76E3
我想编写一个SQL查询,它返回所有服务器中哈希值不同的文件列表 - 即其中一个服务器上的其中一个文件不同。
我唯一能想到的是针对子查询OUTER JOIN
的{{1}},但我真的不知道从哪里开始。
非常感谢任何帮助。
谢谢,
答案 0 :(得分:1)
您可以在此处找到所需的查询:
DECLARE @FilesOnServers TABLE
(
[ServerName] varchar(128) NOT NULL,
[FileName] nvarchar(256) NOT NULL,
[FileHash] varbinary(512) NOT NULL
)
INSERT INTO @FilesOnServers(ServerName, [FileName], [FileHash])
VALUES
('SRVDB001', 'Address.xsd', 0xCF4658AF674),
('SRVDB002', 'Address.xsd', 0xCF4658AF675),
('SRVDB001', 'Company.xsd', 0xBE6E5C376E3);
SELECT DISTINCT F.FileName
FROM
@FilesOnServers F
WHERE
EXISTS (
SELECT *
FROM
@FilesOnServers F2
WHERE
F.[FileName] = F2.[FileName]
AND F.FileHash <> F2.FileHash
AND F.ServerName <> F2.ServerName
)
答案 1 :(得分:0)
我认为这应该可以解决问题:
select file_name from your_table
group by file_name, file_hash
having count(*) > 1
按file_name和file_hash分组,只返回结果中有多个记录的名称。因此,如果所有记录中都出现相同的file_name和file_hash,那么会产生一个结果行,因此会被HAVING子句过滤掉。
答案 2 :(得分:0)
它为每个FileName查找不同的FileHashes。如果为FileName找到多于1个不同的FileHash,则返回FileName。
SELECT FileName
FROM Table
GROUP BY FileName
HAVING COUNT(DISTINCT FileHash) > 1