【问题标题】:Compare values across two tables grouped by another value SQL比较按另一个值 SQL 分组的两个表中的值
【发布时间】:2020-09-25 08:37:24
【问题描述】:

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

所以从下面的数据来看

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

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

UserID      EntityID
1000        100

这如何在 SQL 中完成?

【问题讨论】:

  • “如何在 SQL 中最好地做到这一点?” 这是一个过于宽泛的问题。您在这里的具体问题是什么?您尝试过的方法无效怎么办,或者为什么您觉得它不是“最好的”?什么定义了“最佳”?
  • 你忘了给我们表名。
  • 抱歉,我的意思是如何做到这一点,最好或其他。

标签: sql sql-server inner-join having-clause relational-division


【解决方案1】:

我将其理解为关系划分问题。您可以使用连接和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 子句确保所有类型都匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多