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

2 つの属性を確認する必要がある場合は、ここで行ったように、テーブルを一度結合する必要があります。3 つの属性を確認する必要がある場合は、2 つの結合が必要になります。さらに属性が必要な場合は、さらに結合が必要になります。これは効率的にスケーリングする可能性は低いです。

于 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」と呼ばれる属性が 1 つだけあることを前提としています。それ以上ある場合は、もう少し複雑なクエリが必要です。タグはせいぜい 1 つだと思いますか?

于 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 に答える