2015-02-10 2 views
1

Мне нужна небольшая помощь с SQL-запросом (SQL Server 2012).SQL Query - выберите, где все по-другому

Я написал скрипт, который вычисляет SHA256 набора файлов, хранящихся в целом ряде серверов и сохраняет его в таблице базы данных со столбцами:

  • сервера
  • FileName
  • FileHash

Некоторые примеры строк из таблицы:

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

Я хотел бы написать SQL-запрос, который возвращает список файлов, в которых хэш не является одинаковым для всех серверов - то есть один из файлов отличается на одном из серверов.

Единственное, что я могу придумать, это OUTER JOIN против подзапроса (SELECT DISTINCT [FileName]...), но я не знаю с чего начать.

Любая помощь очень ценится.

Спасибо,

ответ

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

Это один работал лучше для меня, спасибо –

+0

Это легко ответить на такие вопросы, как ваша. Точный и точный. –

0

Я думаю, что это следует сделать трюк:

select file_name from your_table 
group by file_name, file_hash 
having count(*) > 1 

It группы от file_name и file_hash и возвращает только имена, где есть более чем одна запись в результат. Поэтому, если во всех записях появилось одно и то же имя_файла и file_hash, это создало бы одну результирующую строку и, следовательно, было бы отфильтровано с помощью предложения HAVING.

+0

Спасибо за супер-быстрый ответ Карл –

0

Он ищет отдельные FileHash для каждого FileName. Если для FileName найдено более 1 отдельного FileHash, он возвращает FileName.

SELECT FileName 
FROM Table 
GROUP BY FileName 
HAVING COUNT(DISTINCT FileHash) > 1 
Смежные вопросы