2016-11-02 44 views
2

我试图找到设备,需要:WHERE <Cond> OR <Cond>但不能同时

  • “PatchManagementPremium”并不在列INSTANCENAME存在
  • “REMOTECONTROL”并不在列存在INSTANCENAME
  • 这两个条目不列INSTANCENAME

存在,但我要排除所有地方两个条目是真实的结果,我做到了不是M到目前为止要做的事情。不管是什么我想,当1和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 
    ((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不应位于查询的输出中。

+0

嗨,因为你在这里开发SQL - 你的问题规范有点令人困惑 - 你的子弹点列表是MANAGEResque - 它不告诉我们你是否想要一个,一些或所有的条件 - 有最好的猜测可用 - 遗憾地告诉你关于它 – Cato

回答

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; 

谢谢大家的帮助!

+0

我认为我的修改可以改进,但它做的工作! :) – druid

1

如果我理解你正确,你基本上可以做到这一点:

WHERE NOT(1 AND 2) AND (1 OR 2) 
0

移动过滤器HAVING条款并做条件计数

这里是做

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 
0

的一种方式我想你可能会在这里使用NOT EXISTS。

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

如果只想在两个值都存在的情况下排除,您可以使用。

SELECT DISTINCT 
     Devices.DeviceName 
FROM Devices 
     JOIN InventoryIntegrationData InventoryUpdate ON Devices.DeviceID = InventoryUpdate.DeviceID 
WHERE InventoryUpdate.IntegrationDate IS NOT NULL 
     AND Devices.TopologyType IN ('_DB_DEVTYPE_CLIENT_','_DB_DEVTYPE_RELAY_') 
     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; 
+0

如果他确实有'RemoteControl',但不'PatchManagementPremium' - 他想看那条记录吗?我明白他确实希望看到这样的记录 - 只要不是他同时拥有 – Cato

+0

@AndrewDeighton我已经8次阅读了这个问题,并且诚实地说不能告诉你他们究竟要求什么。大声笑..但我认为你是对的 – JamieD77

+0

我也认为 - 让我们拭目以待! – Cato

0

我觉得你说的两种情况之一或两者缺失(所以他们都存在除外)

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; 
相关问题