SQL查询 - 选择不同的地方

时间:2015-02-10 20:55:37

标签: sql sql-server

我需要一点SQL查询帮助(SQL Server 2012)。

我编写了一个脚本,用于计算存储在多个服务器上的一组文件的SHA256,并将其存储在带有列的数据库表中:

  • 服务器
  • 文件名
  • FileHash

表格中的一些示例行:

SRVDB001, Address.xsd, CF4658A...F674
SRVDB002, Address.xsd, CF4658A...F674
SRVDB001, Company.xsd, BE6E5C3...76E3

我想编写一个SQL查询,它返回所有服务器中哈希值不同的文件列表 - 即其中一个服务器上的其中一个文件不同。

我唯一能想到的是针对子查询OUTER JOIN的{​​{1}},但我真的不知道从哪里开始。

非常感谢任何帮助。

谢谢,

3 个答案:

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