What I generally do is filter for the desired software within the join and then look for the entries where the guid is null. Basiscally a similar way of doing what the KB article above shows...
Here is an example from ns 7.0 where I also look for active asset status and windows xp only.
DECLARE @v1_TrusteeScope nvarchar(max)
SET @v1_TrusteeScope = N'%TrusteeScope%'
SELECT
[vri2_Computer].[Name],
[dca4_AeX AC Identification].[Client Date]
FROM
[vRM_Computer_Item] AS [vri2_Computer]
LEFT OUTER JOIN [Inv_AddRemoveProgram] AS [dca3_AddRemoveProgram]
ON ([vri2_Computer].[Guid] = [dca3_AddRemoveProgram].[_ResourceGuid] AND ([dca3_AddRemoveProgram].DisplayName = N'Microsoft Office Professional Plus 2010'))
LEFT OUTER JOIN [Inv_AeX_AC_Identification] AS [dca4_AeX AC Identification]
ON ([vri2_Computer].[Guid] = [dca4_AeX AC Identification].[_ResourceGuid])
LEFT OUTER JOIN [vAsset] AS [ajs4_vAsset]
ON ([vri2_Computer].[Guid] = [ajs4_vAsset].[_ResourceGuid])
LEFT OUTER JOIN [vOSOperatingSystem] AS [vOS]
ON ([vri2_Computer].[Guid] = [vOS].[_ResourceGuid])
WHERE
(
(
[dca3_AddRemoveProgram].[_ResourceGuid] IS NULL
AND
([ajs4_vAsset].[Status] = N'Active')
AND
([vOS].[Name] LIKE '%Windows XP%')
)
AND
([vri2_Computer].[Guid] IN (SELECT [ResourceGuid] FROM [ScopeMembership] WHERE [ScopeCollectionGuid] IN (SELECT [ScopeCollectionGuid] FROM dbo.fnGetTrusteeScopeCollections(@v1_TrusteeScope))))
)