我有三张这样的桌子。
Entity_Table
|e_id|e_name|e_type |e_tenant|
|1 | Bob | bird | owner_1|
|2 | Joe | cat | owner_1|
|3 | Joe | cat | owner_2| AttributeValue_Table
|av_id|prop_name |prop_value|
|1 | color | black |
|2 | color | white |
|3 | wing size| 7" |
|4 | whiskers | long |
|5 | whiskers | short |
|6 | random | anything | Entity_AttrVal
|e_id|av_id|
| 1 | 1 |
| 1 | 3 |
| 2 | 2 |
| 2 | 5 |
| 3 | 1 |
| 3 | 4 |
| 3 | 6 |我想要做的是‘查找实体e_name='Joe’以及color=black和whiskers=short。
我可以获得一个结果集,其中每一行都有一个支柱/值,以及实体信息,因此查询一个属性是可行的。但是我需要能够做任意的N个属性。我该怎么做这样的事?
是否可以将所有属性都作为列或其他内容构建联接表?
edit2:看来我能做这样的事
SELECT et.e_id, et.e_name, et.e_type
FROM Entitiy_table et
LEFT JOIN Entity_AttrVal j ON et.e_id = j.e_id
RIGHT JOIN AttributeValue_Table at ON at.av_id = j.av_id
WHERE (av.prop_name='color' AND av.prop_value='white') OR (av.prop_name='whiskers' AND av.prop_value='long')
GROUP BY et.e_id, et.e_name, et.e_type
HAVING COUNT(*) = 2;发布于 2016-04-05 19:54:14
您必须为每个名称/值组合添加一个谓词:
SELECT <whatever you need>
FROM Entity_Table et
WHERE et.e_name = 'Joe'
AND EXISTS (SELECT 1
FROM AttributeValue_Table avt
JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
WHERE ea.a_id = avt.av_id
AND avt.prop_name = 'color'
AND avt.prop_value = 'black')
AND EXISTS (SELECT 1
FROM AttributeValue_Table avt
JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
WHERE ea.a_id = avt.av_id
AND avt.prop_name = 'whiskers'
AND avt.prop_value = 'short')(如果我的Sql Server方言闪现出来,我很抱歉)
要进行任意数量的比较,必须生成SQL并执行它。
正如在一篇评论中所说的,这表明EAV是一种痛苦(实际上是一种反模式),但我从经验中知道,如果我们绑定到关系数据库,有时就没有其他选择。
https://stackoverflow.com/questions/36432744
复制相似问题