Select DISTINCT SYS.Netbios_Name0 From v_R_System SYS
Join v_FullCollectionMembership COL on COL.ResourceID =
SYS.ResourceID
WHERE
COL.CollectionID = 'UCP00020'
AND NOT EXISTS (
Select DISTINCT SYS.Netbios_Name0, SYS.User_Name0,
SP.ProductName, SP.CompanyName, SP.ProductVersion
From v_GS_SoftwareProduct SP
Join v_R_System SYS on SP.ResourceID = SYS.ResourceID
Join v_FullCollectionMembership COL on COL.ResourceID =
SYS.ResourceID
Where SP.ProductName Like 'Cisco AMP%'
AND COL.CollectionID = 'UCP00020')
When you use EXISTS / NOT EXISTS, the subquery should always be correlated to the outer query. What happens (logically) is that the subquery is evaluated for every row in the outer query.
But if there is no correlation between the queries, this means that the query will return either all rows in the outer table, or no rows at all. And since you have NOT EXISTS and the subquery returns rows, you get no rows back from the outer query.
Now, I don't know your tables, but I guess that this is the query you want_
Select DISTINCT SYS.Netbios_Name0 From v_R_System SYS
Join v_FullCollectionMembership COL on COL.ResourceID = SYS.ResourceID
WHERE
COL.CollectionID = 'UCP00020'
AND NOT EXISTS (
Select DISTINCT SYS.Netbios_Name0, SYS.User_Name0, SP.ProductName, SP.CompanyName, SP.ProductVersion
From v_GS_SoftwareProduct SP
Join v_R_System SYS on SP.ResourceID = SYS.ResourceID
Where SP.ProductName Like 'Cisco AMP%'
AND COL.CollectionID = 'UCP00020'
AND COL.ResourceID = SYS.ResourceID)
If you compare, you will see that I removed the join to v_FullCollectionMembership from the subquery, and moved the join condition to the WHERE clause.