2

次のデバイスを探しています。

  • インスタンス名列に「PatchManagementPremium」が存在しない
  • 「RemoteControl」が列インスタンス名に存在しません
  • 両方のエントリが列 instancename に存在しません

しかし、両方のエントリが真であるすべての結果を除外したいのですが、これまではできませんでした。何を試しても、1 と 2 が true の場合、false のように動作します...

SELECT DISTINCT 
    Devices.DeviceName
FROM
    Devices
LEFT OUTER JOIN 
    CustInv_ObjType_6121 BCMModulesVersions ON Devices.DeviceID = BCMModulesVersions.DeviceID
LEFT OUTER JOIN 
    InventoryIntegrationData InventoryUpdate ON Devices.DeviceID = InventoryUpdate.DeviceID
WHERE  
    ((BCMModulesVersions.InstanceName NOT IN ('PatchManagementPremium', 'RemoteControl'))
    AND (InventoryUpdate.IntegrationDate IS NOT NULL)
    AND Devices.TopologyType IN ('_DB_DEVTYPE_CLIENT_', '_DB_DEVTYPE_RELAY_'))
ORDER BY 
    Devices.DeviceName ASC; 

より明確にするために:私は、いくつかのモジュールをロードできるかどうかに関係なく、アプリケーションをサポートしています。この情報はデータベースに保存されます。モジュールがロードされると、そのデバイスのインスタンス名列にその名前 (remotecontrol、patchmanagementpremium など) が表示されます。

モジュール remotecontrol がロードされていないか、モジュール パッチがロードされていないか、両方のモジュールがロードされていないすべてのデバイスをリストしたいと考えています。

両方のエントリがロードされている場合、devicename はクエリの出力に含まれません。

4

5 に答える 5

1

私があなたを正しく理解していれば、基本的にこれを行うことができます:

WHERE NOT(1 AND 2) AND (1 OR 2)
于 2016-11-02T14:56:29.363 に答える
0

JamieD77 のおかげで解決策を見つけました! :)

SELECT DISTINCT
        Devices.DeviceName
FROM    Devices
        JOIN InventoryIntegrationData InventoryUpdate ON Devices.DeviceID = InventoryUpdate.DeviceID
        JOIN CustInv_ObjType_6121 BCMModulesVersions ON Devices.DeviceID = BCMModulesVersions.DeviceID
WHERE   InventoryUpdate.IntegrationDate IS NOT NULL
        AND Devices.TopologyType IN ('_DB_DEVTYPE_CLIENT_','_DB_DEVTYPE_RELAY_')
        AND BCMModulesVersions.InstanceName NOT IN ('PatchManagement','RemoteControl')
        AND 2 > ( SELECT COUNT(DISTINCT BCMModulesVersions.InstanceName)
                         FROM   CustInv_ObjType_6121 BCMModulesVersions
                         WHERE  Devices.DeviceID = BCMModulesVersions.DeviceID
                                AND BCMModulesVersions.InstanceName IN ('PatchManagementPremium','RemoteControl'))
ORDER BY Devices.DeviceName ASC; 

助けてくれてありがとう!

于 2016-11-07T17:57:25.660 に答える
0

フィルターをHAVING句に移動し、条件付きカウントを行います

ここにそれを行う1つの方法があります

SELECT Devices.DeviceName
FROM   Devices
       JOIN CustInv_ObjType_6121 BCMModulesVersions
         ON Devices.DeviceID = BCMModulesVersions.DeviceID
       JOIN InventoryIntegrationData InventoryUpdate
         ON Devices.DeviceID = InventoryUpdate.DeviceID
WHERE  ( InventoryUpdate.IntegrationDate IS NOT NULL )
       AND Devices.TopologyType IN ( '_DB_DEVTYPE_CLIENT_', '_DB_DEVTYPE_RELAY_' )
GROUP  BY Devices.DeviceName
HAVING Count(CASE
               WHEN BCMModulesVersions.InstanceName IN ( 'PatchManagementPremium', 'RemoteControl' ) THEN 1
             END) = 0 
于 2016-11-02T14:56:36.607 に答える
0

2つのケースの一方または両方が欠落していると言っていると思います(したがって、両方が存在することは除外されます)

SELECT DISTINCT 
    Devices.DeviceName
FROM
    Devices
LEFT OUTER JOIN 
    CustInv_ObjType_6121 BCMModulesVersions ON Devices.DeviceID = BCMModulesVersions.DeviceID
LEFT OUTER JOIN 
    InventoryIntegrationData InventoryUpdate ON Devices.DeviceID = InventoryUpdate.DeviceID
WHERE  

    (NOT EXISTS (SELECT 0 FROM CustInv_ObjType_6121 X WHERE X.InstanceName IN('RemoteControl'))
        OR
     NOT EXISTS (SELECT 0 FROM CustInv_ObjType_6121 Y WHERE Y.InstanceName IN('PatchManagementPremium'))
    )
    AND (InventoryUpdate.IntegrationDate IS NOT NULL)
    AND Devices.TopologyType IN ('_DB_DEVTYPE_CLIENT_', '_DB_DEVTYPE_RELAY_')
ORDER BY 
    Devices.DeviceName ASC; 
于 2016-11-02T15:39:44.680 に答える