Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将数据对象表与视图中的关联属性表合并_Sql Server - Fatal编程技术网

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

Sql server 将数据对象表与视图中的关联属性表合并,sql-server,Sql Server,设置如下:我有几个表保存数据对象的信息,这些数据对象可能有各种各样的数据位与它们关联。每个表都有一个关联的属性表,其中包含3位信息: 与属性关联的行的id(整数) 短属性名称(

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

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

    ****编辑****

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

    例如,如果我的表Foo中有“Bar”、“Bat”和“Baz”列,那么视图中就会有这些列,此外,还会有一行可能具有的任何属性的列

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

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


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

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

    建议为每个实体表创建一个视图,并连接到其相关的“属性”表

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

      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
    
    要从中消费,您可以:

    从Foo中选择*其中ID=4

    SELECT*FROM Foo,其中ShortName='Ender'

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

    Select ...
    From ObjectTable
        Join AttributeTable
            On AttributeTable.Id = ObjectTable.Id
    
    然而,我怀疑你想要的是后者或类似的东西:

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

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

    当我编写编辑时,我意识到我要寻找的是不可能的。你能为源表模拟一些虚拟数据吗,以及你希望如何查看它?根据Thomas的回答,我认为解决方法是不要按照我最初想要的方式来处理这个问题。我确实对每个实体表都有一个视图,对此我不是很清楚。拆分属性表的原因基本上是为了数据库结构的简单性和可读性。我们(我的团队)考虑过做一个大型属性表,但决定不做,以避免将属性项映射到它所引用的表的复杂性。我得出的结论与我在这一主题上的更多思考相同。感谢您的输入:)