我有一个如下所示的属性值表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
在 Sybase ASE(12 或 15)中是否有一种优雅的方法可以随着我们增加表和属性的数量而很好地扩展?
“规模”是指 4-5 个连接表需要约 10-20 个属性
我可以想到以下解决方案,所有这些似乎都很糟糕:
解决方案 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
优点:不再有额外的连接使查询变得丑陋且性能不佳。
缺点:就代码质量而言,扩展性有些差(需要添加具有新属性的新变量)。
有更好的解决方案吗?