我有一个如下所示的属性值表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
优点:不再有额外的连接使查询变得丑陋且性能不佳。
缺点:就代码质量而言,扩展性有些差(需要添加具有新属性的新变量)。
有更好的解决方案吗?