2015-02-10 23 views
1

我需要SQL查詢(SQL Server 2012)的一些幫助。SQL查詢 - 選擇事物不同的地方

我寫了一個腳本,計算一組存儲在多個服務器之間,並將其存儲在一個數據庫表中的列文件的SHA256:

  • 服務器
  • 文件名
  • FileHash

從表中的一些示例行:

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

我想編寫一個SQL查詢,它返回所有服務器中哈希不相同的文件列表 - 即其中一個服務器上的一個文件不同。

我唯一能想到的是針對子查詢(SELECT DISTINCT [FileName]...)OUTER JOIN,但我真的不知道從哪裏開始。

任何幫助,非常感謝。

感謝,

回答

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 
    ) 
+0

這樣一個爲我工作最好的,謝謝 – 2015-02-10 21:19:07

+0

。精確和重點。 – 2015-02-10 21:27:12

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子句過濾掉。

+0

感謝您的超快速響應卡爾 – 2015-02-10 21:05:09

0

它爲每個FileName查找不同的FileHashes。如果爲FileName找到多於1個不同的FileHash,它將返回FileName。

SELECT FileName 
FROM Table 
GROUP BY FileName 
HAVING COUNT(DISTINCT FileHash) > 1