2016-04-12 18 views
1

私はSSRSレポートを作成していますが、私が思っているレコードを組み込みたいと思っていますが、うまくいけば誰かが間違っていると分かるかもしれません。私はそれを回避する方法を見つけようとしていましたが、正直なところSQLに精通していません。クエリは、具体的には、win7エンタープライズではなく、オフィス2013を持たないマシンレコードのSCCM 2012 DBからのデータを取得することです。問題点私は、SoftwareFileテーブルにoutlook.exeのレコードがない特定のマシンであるため、結果セットには表示されません。私は、たとえoutlook.exeファイルが存在しなくても、それを表示する方法を見つけたいと思います。存在しない場合のSQLクエリ

ここに私が働きかけようとしていた現在のクエリがありますが、最後の行を削除したときに表示されるマシンはまだ表示されません。私はあなたが外をしたいと思います

SELECT Distinguished_Name0, Full_Domain_Name0, User_Name0, Netbios_Name0, OS.Caption0, IP_Addresses0, SystemType0, Model0, SYS.ResourceID, 
[Office2013] = CASE 
    WHEN [FileName] = 'outlook.exe' and left(FileVersion, 2) = '15'  THEN 'TRUE' 
    WHEN Not Exists (Select * from v_GS_SoftwareFile where SF.ResourceID = Sys.ResourceID and [FileName] = 'outlook.exe') THEN 'FALSE' 
    ELSE 'FALSE' 
END 

FROM v_R_System SYS 

INNER JOIN v_GS_OPERATING_SYSTEM OS 
ON SYS.ResourceID = OS.ResourceID 
INNER JOIN v_RA_System_IPAddresses IP 
ON SYS.ResourceID = IP.ResourceID 
INNER JOIN v_GS_COMPUTER_SYSTEM CO 
ON SYS.ResourceID = CO.ResourceID 
INNER JOIN v_GS_SoftwareFile SF 
ON SYS.ResourceID = SF.ResourceID 

WHERE sys.Distinguished_Name0 LIKE '%DC=local' 
AND sys.Distinguished_Name0 NOT LIKE '%Server%' 
AND IP_Addresses0 LIKE '10.0.0.%' 
AND Model0 LIKE '%%' 
AND OS.Caption0 <> 'Microsoft Windows 7 Enterprise' 
AND (SF.[FileName] = 'outlook.exe' 
OR NOT EXISTS (Select * from v_GS_SoftwareFile where SF.ResourceID = SYS.ResourceID and [FileName] = 'outlook.exe')) 

答えて

0

をあなたのサブクエリ内の別名SFあなた外部クエリのv_GS_SoftwareFileにを参照しているので、あなたのnot existsクエリが動作しない理由は、ありますサブクエリではありません。

AND (SF.[FileName] = 'outlook.exe' 
OR NOT EXISTS (Select * from v_GS_SoftwareFile where SF.ResourceID = SYS.ResourceID and [FileName] = 'outlook.exe')) 
                ^^ this is referring to outer v_GS_SoftwareFile 

SF.ResourceID = SYS.ResourceIDは常に(原因の参加条件に)真となりますので、テーブル内の少なくとも1行は、あなたが提供する必要がありますoutlook.exe

FileNameのために持っている場合not existsクエリは常にfalseを返しますサブクエリ内のテーブル別名別名

AND (SF.[FileName] = 'outlook.exe' 
OR NOT EXISTS (Select * from v_GS_SoftwareFile SF2 where SF2.ResourceID = SYS.ResourceID and [FileName] = 'outlook.exe')) 

私はおそらくあなたの質問を理解していないでしょう。しかし、目的がoutlook.exeが存在するかどうかをマシンに表示することであれば、where句からoutlook.exeを単に削除しないでください。

+1

これをスペルナップしていただきありがとうございます。私は、これがどのように結果セットを変更するのかを試してみる。目標は、outlook.exeのバージョンが定義されたバージョンと等しい場合のブール列を表示することですが、存在しない場合も表示します。現在存在しないときには表示に失敗します。 – ssaviers

0

参加:

SELECT . . . 
FROM v_R_System SYS INNER JOIN 
    v_GS_OPERATING_SYSTEM OS 
    ON SYS.ResourceID = OS.ResourceID INNER JOIN 
    v_RA_System_IPAddresses IP 
    ON SYS.ResourceID = IP.ResourceID INNER JOIN 
    v_GS_COMPUTER_SYSTEM CO 
    ON SYS.ResourceID = CO.ResourceID LEFT JOIN 
    v_GS_SoftwareFile SF 
    ON SYS.ResourceID = SF.ResourceID AND 
     SF.[FileName] = 'outlook.exe' 
WHERE sys.Distinguished_Name0 LIKE '%DC=local' AND 
     sys.Distinguished_Name0 NOT LIKE '%Server%' AND 
     IP_Addresses0 LIKE '10.0.0.%' AND 
     Model0 LIKE '%%' AND 
     OS.Caption0 <> 'Microsoft Windows 7 Enterprise' 
+0

外部結合はどこで行いますか? – ssaviers

+0

@ssaviers。 。 。それは非常に奇妙です。外部結合が欠落していただけでなく、次の行が正しくインデントされていませんでした。私は答えを入れる前にいくつかのものを誤って削除したのでしょうか? –

関連する問題