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

比较由另一个SQL值分组的两个表中的值,sql,sql-server,inner-join,having-clause,relational-division,Sql,Sql Server,Inner Join,Having Clause,Relational Division,为了让用户能够访问实体,用户必须具有针对实体配置的必要分类。分类具有不同属性类型的多个属性。用户同样具有多个属性。为了让用户满足分类的要求,他们必须至少对分类应用每种类型的一个属性 那么从下面的数据来看, dbo.Classification ClassificationID ClassificatinName 10 Class1 dbo.Attribute AttributeID AttributeName AttributeType

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

那么从下面的数据来看,

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应该满足ClassificationID 10和EntityID 100的要求,因为它们至少有一个针对该分类配置的每种类型的属性,但用户200不应该。我希望最终返回的数据是:

UserID      EntityID
1000        100

在SQL中如何做到这一点?

我将其理解为一个关系除法问题。您可以使用联接和一个
具有用于筛选的
子句来接近它:

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
)

基本上,这会带来其属性至少有一种类型与目标实体相同的所有用户。然后having子句确保所有类型都匹配。

“如何在SQL中最好地做到这一点?”这是一个过于宽泛的问题。你的具体问题是什么?那你试过但没有成功,或者为什么你觉得它不是“最好的”呢?什么定义了“最佳”?你忘了给我们表名。对不起,这是怎么做到的,最佳或其他是我的意思。