mysql - SQL : How to check "if this record exists then that record must also exist" for given ID set

标签 mysql multiple-conditions

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

关于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/

相关文章:

python - Python中的多个 'or'条件

javascript - 逻辑运算符两侧的 if 语句中的多个条件

具有多个条件的python lambda列表过滤

php - 在mysql中的一列中选择多个具有相同值的行?

mysql - 将 MSSQL 转换为 MySQL

mysql - 正确的查询语句是什么?

JOIN 语句中的 MySQL 额外条件

javascript - 单击自定义按钮时事件的全日历执行顺序

javascript - 将两个相互关联的菜单从静态转换为动态

java - if 语句中的动态 AND 条件