我的数据库表(DWInfo)如下所示:

InstanceID | AttributeID
1          | 1
1          | 2
1          | 3
2          | 1
2          | 4
3          | 1
3          | 2


有多个实例,每个实例都有多个属性。
我要实现的目标是:对于给定的ID集/规则,我想获取所有违反条件的InstanceID,例如,让给定的ID为1和2,这意味着如果有一个实例的AttributeID = 1, Attribute = 2也应该存在。在这种情况下,结果将是实例二,因为该实例违反了条件。

我用JOINS尝试过,但这似乎仅对2个属性有效,而对其他属性无效。

Select * from DWInfo dw1 INNER JOIN DWInfo dw2 ON dw1.InstanceID  = dw2.InstanceID  where dw1.AttributeID != dw2.AttributeID and dw1.AttributeID = 1 AND dw2.AttributeID != 2


是否可以使用SQL查询解决此问题?

最佳答案

假设每个InstanceId只能有一个不同的AttributeId之一,即唯一的复合索引(InstanceId, AttributeId)

  SELECT InstanceID
    FROM DWInfo
   WHERE AttributeID IN (1,2)
GROUP BY InstanceID
  HAVING SUM(AttributeId = 1) = 1
     AND COUNT(*) < 2  /* Or SUM(AttributeId = 2) = 0 */


SQLFiddle DEMO

请注意,如果AttributeId为2意味着实例也需要AttributeId为1。..逻辑略有不同,这会更整洁:

  SELECT InstanceID
    FROM DWInfo
   WHERE AttributeID IN (1,2)
GROUP BY InstanceID
  HAVING COUNT(*) < 2

10-04 19:12