为每个Id选择多行查询

时间:2012-08-16 17:42:25

标签: sql oracle

我的表格为'

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设置了多个行,并为不同的值分布。

3 个答案:

答案 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'