如何创建一个视图,其中列名称是根据查询返回值定义的

时间:2009-12-08 22:40:14

标签: sql database-design pivot

首先,我的表格布局:

tblEquippedItems:&lt ;-(表名)
slotid(FK),itemid(FK),charid(FK)&lt ;-(attributes)

所以我有这张表描述角色配备的物品。插槽ID指的是项目插槽,其中项目由itemid表示。 Charid描述了装备这些物品的角色。

我想做的是以某种格式呈现数据:

角色名称|肩部物品|头项目|腿项| ...... | < - 列名


Zalbar |忏悔护肩|忏悔头盔|忏悔护腿| ...... | < - 数据值

^ - 这是我表示查询结果集的微弱尝试。

我想将此表示为一个视图,因此我不必在数据库中有一个不必要且不稳定的表。列名必须来自查询存储项槽名称的查找表。有没有办法以编程方式定义这样的视图?动态SQL可能吗?我很乐意避免......

5 个答案:

答案 0 :(得分:2)

SELECT
    [character].name                    AS [character_name],
    ISNULL([shoulder].name,'Nothing')   AS [shoulder_item_name],
    ISNULL([head].name,'Nothing')       AS [head_item_name],
    etc...
FROM
   [character]
LEFT JOIN
   [tblEquippedItems] AS [shoulder_item]
      ON [shoulder_item].charid = [character].id
      AND [shoulder_item].slotid = 1
LEFT JOIN
   [item]             AS [shoulder]
      ON [shoulder].id = [shoulder_item].itemid
LEFT JOIN
   [tblEquippedItems] AS [head_item]
      ON [head_item].charid = [character].id
      AND [head_item].slotid = 2
LEFT JOIN
   [item]             AS [head]
      ON [head].id = [head_item].itemid

etc...

答案 1 :(得分:0)

您在SQL Server 2005/2008中寻找的是一个Pivot / Cross Tab。您无法定义View of this,因为Views必须是预定义列。您可以在存储过程中执行此操作。

编辑:对于SQL Server 2000,请查看此article about Cross Tabs。虽然您主要看到Cross Tabs / Pivots使用Count()或Sum()聚合,但您可以轻松地在文本值上使用Max()和Min()。

答案 2 :(得分:0)

你会对数据库设计有所了解......像这样的对象属性值表因各种原因被认为是“邪恶的”。

也就是说,当数据库模式需要稳定但最终的属性列表不断变化时(当我能够承受性能后果时),我现在也经常使用它们。

通过使用VIEW,您至少在正确的轨道上,这将使您可以随着尘埃落定而使架构更加稳固。

坏消息:尽管您可以使用PIVOT在SQL端使您的生活更轻松,但查询本身需要使用您想要的实际列名进行编程。

有三种方法可以做到这一点:

  1. 添加/删除属性时手动修改VIEW(头痛)
  2. 动态查询(杂乱,速度慢,无法使用VIEW,需要使用PROCEDURE)
  3. 创建一个存储过程,在修改属性(最复杂)后使用动态SQL删除/创建所有视图

答案 3 :(得分:0)

我认为有很多自我加入

    SELECT t1.charid,t1.itemid as shoulders,t2.itemid as helm,t3.itemid as legs
FROM (SELECT charid,itemid from tblEquippedItems where slotid = 1) t1 //slotid = shuolders
INNER JOIN (SELECT itemid from tblEquippedItems where slotid = 2) t2 //slotid = Helm
ON t1.charid = t2.charid
INNER JOIN (SELECT itemid from tblEquippedItems where slotid = 3) t3 //slotid = Legs
ON t3.charid = t2.charid

除此之外,你可以试试一个支点

答案 4 :(得分:0)

当我需要做交叉标签或枢轴时,我通常在数据库之外进行。

我使用MS Excel,其中的查询以表格形式提取我需要的数据。然后我在MS Excel中进行透视以获得带有“动态列标题”的交叉制表视图。

Excel远非唯一的选择。在高端,您可以使用Cognos数据立方体之类的东西。