av
次のような属性値テーブルがあります。
| attribute | value |
~~~~~~~~~~~~~~~~~~~~~
| a1 | A1 |
| b1 | BB1 |
| b2 | BB2 |
簡単にするために、と列のvarchar(255)
両方attribute
でvalue
、の一意のインデックスを想定しますattribute
。
クエリで特定の属性の値を使用する必要があります。これは次のようになります。
SELECT *
FROM t1
,t2
WHERE t1.a1 = "A1" -- Value of "a1" attribute
AND t1.id = t2.id
AND t2.b1 = "BB1" -- Value of "b1" attribute
AND t2.b2 = "BB2" -- Value of "b2" attribute
テーブルと属性の数を増やすと拡張性の高いSybaseASE(12または15)でこれを行うエレガントな方法はありますか?
「スケール」とは、4〜5個の結合されたテーブル全体で必要な最大10〜20個の属性を意味します
私は次の解決策を考えることができますが、それらはすべてひどいようです:
解決策1:明らか:属性ごとに1回、AVテーブルに参加する
SELECT *
FROM t1
,t2
,av AS 'av_a1'
,av AS 'av_b1'
,av AS 'av_b2'
WHERE t1.a1 = av_a1.value
AND t1.id = t2.id
AND t2.b1 = av_b1.value
AND t2.b2 = av_b2.value
AND av_a1.attribute = "a1"
AND av_b1.attribute = "b1"
AND av_b2.attribute = "b2"
長所:明らかです。
短所:コード品質、そしておそらくパフォーマンスに関しては、スケーリングが非常に不十分です。
解決策2:変数を使用した複数の結合の問題を回避する
declare @a1 varchar(255)
select @a1 = value FROM av WHERE attribute = "a1"
declare @b1 varchar(255)
select @b1 = value FROM av WHERE attribute = "b1"
declare @b2 varchar(255)
select @b2 = value FROM av WHERE attribute = "b2"
SELECT *
FROM t1
,t2
WHERE t1.a1 = @a1
AND t1.id = t2.id
AND t2.b1 = @b1
AND t2.b2 = @b2
長所:余分な結合がなくなるため、クエリのパフォーマンスが低下します。
短所:コードの品質に関しては、スケーリングがやや不十分です(新しい属性を持つ新しい変数を追加する必要があります)。
より良い解決策はありますか?