我有一个类似于Entity
表的模式,与 具有一对多关系Attribute
,与 具有一对多关系Value
。Attribute
有一列Name
,并且Value
有一列Value
:
Entity
------
Id
Name
Attribute
---------
Id
EntityId
Name
Value
-----
Id
AttributeId
Value
我需要能够构建一个查询,该查询将仅返回Entity
具有特定属性/值子项组合的行。目前我正在编写类似这样的查询:
select
*
from Entity e
where exists(
select * from Attribute a
join Value v on v.AttributeId = a.id
where a.EntityId = e.id and a.Name = 'color' and v.Value = 'red')
and exists(
select * from Attribute a
join Value v on v.AttributeId = a.id
where a.EntityId = e.id and a.Name = 'size' and v.Value = 'small')
这可行,但每个额外的属性过滤器都会添加另一个exists
子句,我对性能感到紧张。有没有一种更有效的方法来编写这种类型的查询,或者如果我使用正确的索引等,它是否可能具有完美的性能?