代码之家  ›  专栏  ›  技术社区  ›  Nelson Rothermel

动态列名称

  •  4
  • Nelson Rothermel  · 技术社区  · 15 年前

    是否可以创建一个 看法 (不是存储过程)使用基于另一个表的动态列名?例如:

    Code:
    CodeId|Description
    ------------------
         1|Title
         2|Notes
    
    Data:
    DataId|Content|CodeId|GroupId
    -----------------------------
         1|Title1 |     1|      1
         2|Note1  |     2|      1
         3|Title2 |     1|      2
         4|Note2  |     2|      2
    
    Select Result:
    GroupId|Title |Notes
    -------------------
          1|Title1|Note1
          2|Title2|Note2
    

    列名“title”和“notes”来自 Code 表。我猜答案是否定的,但我想确认一下。谢谢!

    编辑: 我理解这是如何“危险”的。如果有人更新代码描述,视图将更改,从而破坏依赖于列名的任何SQL。在这种情况下,我可以使用codeid,这是不允许更改的。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Tom H zenazn    15 年前

    EAV(实体属性值)模型的危险是多方面的,你只是在为将来的许多头痛做准备。这么说,你的具体问题对我来说似乎是可以解决的。不过你已经被警告过了…

    您可以通过在代码表上放置触发器来实现这一点。每当有人添加、删除或更新表中的某一行时,触发器将负责用正确的语句重新创建视图。

        2
  •  1
  •   mattruma    15 年前

    我在想,更糟糕的情况是,您可以在返回的第一行具有所有列标题的情况下执行某些操作。这会有点棘手,你可能要承受工会的业绩打击,但听起来可行。

        3
  •  1
  •   Jay    15 年前

    您可以用Java或C编写程序,或者使用数据库中的值动态创建“CREATEVIEW”语句,然后执行它。

    如果你在寻找一种只使用SQL语句的方法,我同意答案可能是“无法完成”,但我不愿意做出人们总是想出聪明的方法来做我从未想到过的事情。