Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [Правка] Отчёт SQL (http://forum.oszone.net/showthread.php?t=225667)

clin 19-01-2012 13:48 1839546

[Правка] Отчёт SQL
 
Доброго времени суток всем.
Использую 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 1839564

Здесь поможет другой запрос, точнее 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]
                )



Время: 01:13.

Время: 01:13.
© OSzone.net 2001-