比较由另一个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中最好地做到这一点?”这是一个过于宽泛的问题。你的具体问题是什么?那你试过但没有成功,或者为什么你觉得它不是“最好的”呢?什么定义了“最佳”?你忘了给我们表名。对不起,这是怎么做到的,最佳或其他是我的意思。