我的数据库表 (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 */
请注意,如果 AttributeId 为 2 意味着该实例也需要 AttributeId 为 1.. 逻辑略有不同,这更简洁:
SELECT InstanceID
FROM DWInfo
WHERE AttributeID IN (1,2)
GROUP BY InstanceID
HAVING COUNT(*) < 2
关于mysql - SQL : How to check "if this record exists then that record must also exist" for given ID set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32786142/