在视图中合并数据对象表和关联的属性表

时间:2010-08-09 22:43:59

标签: sql-server

这是设置:我有几个表,用于保存数据对象的信息,这些数据对象可能具有与之关联的各种各样的数据。每个表都有一个关联的属性表,它包含3位信息:

  1. 属性与
  2. 相关联的行的id(整数)
  3. 短属性名称(< 50 chars)
  4. 一个值(varchar)
  5. 对象表将具有任意数量的不同数据类型的列,但始终具有整数主键。如果可能的话,我想设置一个视图,允许我从对象表中选择一行,并且一次性选择所有相关属性。

    **** **** EDIT

    理想情况下,我想要的形式是在视图中使用属性表中匹配属性的名称,并将值作为属性值。

    因此,例如,如果我的表Foo包含“Bar”,“Bat”和“Baz”列,则视图将包含这些列,此外还包含行可能具有的任何属性的列。

    ****结束编辑****

    现在,我知道(或者我认为)SQL不允许使用变量作为列名的别名。是否有一种干净,实用的方式来做我想做的事情,还是我在追逐梦想?

    显而易见的解决方案是在应用程序代码中处理所有这些,但我很好奇是否可以在SQL中完成。

2 个答案:

答案 0 :(得分:1)

答案取决于您实际寻求的内容。视图的输出是每个对象的每个属性一行还是每个对象的每个属性一个?如果是前者,那么我不确定你为什么需要一个观点:

Select ...
From ObjectTable
    Join AttributeTable
        On AttributeTable.Id = ObjectTable.Id

然而,我怀疑你想要的是后者或类似的东西:

Select ...
    , ... As Attribute1
    , ... As Attribute2
    , ... As Attribute3
    ...
From ObjectTable

在这种情况下,生成的列在执行时是未知的,因为属性名称是动态的。这通常称为动态交叉表。通常,SQL语言不是为动态列生成而设计的。在T-SQL中执行此操作的唯一方法是使用一些非常动态的SQL。因此,最好在报告工具或中间层代码中完成。

答案 1 :(得分:0)

听起来你想要每个'对象'表及其'属性'表的视图。如果我的阅读错了,请纠正我。目前尚不清楚“使用变量作为列名的别名”的意图是什么。您希望将所有对象及其不同列合并到一个视图中吗?

建议为每个实体表创建一个视图,并加入其相关的“属性”表。

问题 - 为什么每个实体表都有一个匹配的属性表?他们为什么要分开?也许你的问题更简单或模糊,所以也许我的问题是修辞。

  CREATE VIEW Foo AS 

       SELECT O.ID
              ,O.EverythingElse
              ,A.ShortName
              ,A.SomeVarcharValue
       FROM 
              ObjectTable AS O  --customer, invoice, whathaveyou
       INNER JOIN 
              ObjectAttribute AS A ON A.ObjectID = O.ID

要从中消费,您可以:

SELECT * FROM Foo WHERE ID = 4SELECT * FROM Foo WHERE ShortName = 'Ender'