比较由另一个值SQL分组的两个表中的值

问题描述

为了使用户能够访问实体,用户必须具有针对其配置的必要分类分类具有不同属性类型的多个属性用户同样具有多个属性。为了使用户满足分类要求,他们必须至少将每种类型的一个属性应用于分类

因此,根据以下数据

dbo.Classification
ClassificationID    ClassificatinName
10                  Class1

dbo.Attribute
AttributeID      AttributeName     AttributeTypeID
1                Type1 Attr1       1
2                Type1 Attr2       1
3                Type2 Attr1       2
4                Type2 Attr2       2

dbo.ClassificationAttribute
ClassificationID       AttributeID
10                     1
10                     2
10                     4  

dbo.EntityClassification
EntityID         ClassificationID
100              10

dbo.UserAttribute
UserID                 AttributeID
1000                   1
1000                   4
2000                   2
2000                   3

用户ID 1000应该满足对分类ID 10的要求,因此也应满足对EntityID 100的要求,因为它们具有针对该分类配置的每种类型的至少一个属性,而用户200不应该。我最终要返回的数据是:

UserID      EntityID
1000        100

如何在sql中完成此操作?

解决方法

我理解这是一个关系鸿沟问题。您可以使用联接和having子句进行过滤:

select ec.entityid,ua.userid
from entityclassification ec
inner join attribute a1 on a1.attributeid = ec.attributeid
inner join attribute a2 on a2.attriubutetypeid = a1.attriubutetypeid
inner join userattribute ua on ua.attributeid = a2.attributeid
where ec.entityid = 100
group by ec.entityid,ua.userid
having count(distinct a2.attriubutetypeid) = (
    select count(distinct a3.attriubutetypeid)
    from entityclassification ec3
    inner join attribute a3 on a3.attributeid = ec.attributeid
    where ec3.entityid = 100
)

基本上,这会使所有属性与目标实体至少具有一种共同类型的所有用户。然后Have子句确保所有类型都匹配。