我的数据库表(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