代码之家  ›  专栏  ›  技术社区  ›  Ender

将数据对象表与视图中的关联属性表合并

  •  0
  • Ender  · 技术社区  · 14 年前

    设置如下:我有几个表,其中包含数据对象的信息,这些数据对象可能有各种各样的数据位与它们关联。每个表都有一个关联的属性表,其中包含3位信息:

    1. 与属性关联的行的id(整数)
    2. 短属性名(<50个字符)

    对象表将有任意数量的不同数据类型的列,但始终有一个整数主键。如果可能的话,我想设置一个视图,允许我从object表中选择一行,以及它的所有相关属性。

    ****编辑****

    理想情况下,我希望采用的形式是在视图中具有列,其中包含attributes表中匹配属性的名称,并将值作为属性的值。

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

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   Thomas    14 年前

    答案取决于你在寻找什么。视图的输出是每个对象的每个属性有一行还是一行 每个属性每个对象?如果是前者,那么我不知道你为什么需要一个视图:

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

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

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

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

        2
  •  0
  •   p.campbell    14 年前

    听起来像是您需要每个“object”表及其“attributes”表的视图。如果我读错了,请纠正我。“使用变量作为列名的别名”的意图并不清楚。您是否希望将所有具有不同列的对象合并到一个视图中?

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

      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 = 4 SELECT * FROM Foo WHERE ShortName = 'Ender'