问题描述
为了使用户能够访问实体,用户必须具有针对其配置的必要分类。分类具有不同属性类型的多个属性。用户同样具有多个属性。为了使用户满足分类要求,他们必须至少将每种类型的一个属性应用于分类。
因此,根据以下数据
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子句确保所有类型都匹配。