Войти

Показать полную графическую версию : [Правка] Отчёт SQL


clin
19-01-2012, 13:48
Доброго времени суток всем.
Использую SMS 2007 для развёртывания ПО. Использовал отчёт для поиска всех машин, на которых установлен NOD 32.
Теперь задача стала в обратном — найти все машины, на которых он не установлен.
Вот сам отчёт, который находит машины, на которых есть NOD32

SELECT TOP (100) PERCENT dbo.v_R_System.Name0 AS [Computer name], dbo.v_R_System.User_Name0 AS [User name],
dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 AS [ESET NOD32 Antivirus]
FROM dbo.v_R_System INNER JOIN
dbo.v_GS_ADD_REMOVE_PROGRAMS ON dbo.v_R_System.ResourceID = dbo.v_GS_ADD_REMOVE_PROGRAMS.ResourceID
WHERE (dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 = 'ESET NOD32 Antivirus')
ORDER BY [Computer name]

Что-то подсказывает, что надо изменить параметр WHERE, но не знаю на какой. Подскажите пожалуйста.

Delirium
19-01-2012, 14:13
Здесь поможет другой запрос, точнее 2 подзапроса в одном. Сейчас попробую написать в блокноте и выложить.

SELECT TOP (100) PERCENT
dbo.v_R_System.Name0 AS [Computer name],
dbo.v_R_System.User_Name0 AS [User name],
dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 AS [ESET NOD32 Antivirus]
FROM
dbo.v_R_System INNER JOIN
dbo.v_GS_ADD_REMOVE_PROGRAMS ON
dbo.v_R_System.ResourceID = dbo.v_GS_ADD_REMOVE_PROGRAMS.ResourceID
WHERE
[Computer name] not in
(
SELECT TOP (100) PERCENT
dbo.v_R_System.Name0 AS [Computer name],
FROM
dbo.v_R_System INNER JOIN
dbo.v_GS_ADD_REMOVE_PROGRAMS ON
dbo.v_R_System.ResourceID = dbo.v_GS_ADD_REMOVE_PROGRAMS.ResourceID
WHERE
dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 = 'ESET NOD32 Antivirus'
ORDER BY [Computer name]
)

ORDER BY [Computer name]

Суть в том, что ты в подзапросе WHERE выбираешь имена машин, где стоит НОД, А в основном запросы ты выбираешь ВСЕ машины, за исключением тех, которые в списке подзапроса.
Для ускорения работы запроса, если в таблице есть ID, лучше подзапрос написать так:

WHERE
dbo.v_R_System.ID not in
(
SELECT TOP (100) PERCENT
dbo.v_R_System.ID AS [Computer name],
FROM
dbo.v_R_System INNER JOIN
dbo.v_GS_ADD_REMOVE_PROGRAMS ON
dbo.v_R_System.ResourceID = dbo.v_GS_ADD_REMOVE_PROGRAMS.ResourceID
WHERE
dbo.v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 = 'ESET NOD32 Antivirus'
ORDER BY [Computer name]
)




© OSzone.net 2001-2012