我的表格为'
Attribute_name attribute_value Attr_id uniquey_keyId
tag A 111 1
price 113 111 2
product B 111 3
value 115 111 4
我需要选择attribute_value当attribute_name = tag for all where attribute_value = 115 for each Attr_id;
输出应为“ 甲
在这种情况下,我们为同一个ID设置了多个行,并为不同的值分布。
答案 0 :(得分:1)
这种实体属性数据模型将产生重大性能问题。您将不得不经常编写自联接来将数据转换为您可以实际查询的内容。这将是缓慢的,并且将会非常糟糕地扩展。
那就是说
SELECT t.attribute_value
FROM (SELECT attr_id, attribute_name, attribute_value
FROM table_name
WHERE attribute_name = 'value') v,
(SELECT attr_id, attribute_name, attribute_value
FROM table_name
WHERE attribute_name = 'tag') t
WHERE t.attr_id = v.attr_id
AND v.attribute_value = '115';
如果你需要查看两个属性,你需要像我在这里一样将表连接到自己。如果您需要查看三个属性,则需要两个连接。如果您需要更多属性,则需要更多连接。这不太可能有效扩展。
答案 1 :(得分:1)
我认为你可以通过一个有趣的条款来实现这个目的:
select attr_id, max(case when Attribute_name= 'tag' then attribute_value end)
from t
group by attr_id
having sum(case when Attribute_name= 'value' and Attibute_value = '115'
then 1 else 0
end) > 0
这假设每个attr_id只有一个名为“tag”的属性。如果还有更多,则需要稍微复杂一点的查询。你能假设最多有一个标签吗?
答案 2 :(得分:1)
这是PIVOT查询的典型应用程序
SELECT * from (
SELECT Attr_id, attribute_value, Attribute_name
FROM schem
)
PIVOT
(
MAX(attribute_value)
FOR Attribute_name IN ('tag','price','product','value')
)
这会创建一个类似
的表格Attr_id tag price product value
111 A 113 B 115
112 X 90 C 50
我会根据此透视查询创建一个视图。基于这种观点,您的问题变得非常简单
SELECT tag
FROM pivot_view
WHERE value = '115'