0

我有表方案作为'

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_name = tag for all where attribute_value = 115 for each Attr_id 时,我需要选择attribute_value;

输出应该是“A

在这种情况下,我们有多个相同的 id 行并分布在不同的值上。

4

3 回答 3

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';

如果您需要查看两个属性,则需要像我在这里所做的那样将表连接到自身一次。如果您需要查看三个属性,则需要两个连接。如果您需要更多属性,则需要更多连接。这不太可能有效地扩展。

于 2012-08-16T17:50:27.770 回答
1

我认为您可以使用 group by 和 fun having 子句来做到这一点:

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”的属性。如果有更多,您需要一个稍微复杂的查询。你能假设最多有一个标签吗?

于 2012-08-16T18:05:11.377 回答
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'
于 2012-08-16T18:07:16.550 回答