首先,我的表格布局:
tblEquippedItems:&lt ;-(表名)
slotid(FK),itemid(FK),charid(FK)&lt ;-(attributes)
所以我有这张表描述角色配备的物品。插槽ID指的是项目插槽,其中项目由itemid表示。 Charid描述了装备这些物品的角色。
我想做的是以某种格式呈现数据:
角色名称|肩部物品|头项目|腿项| ...... | < - 列名
Zalbar |忏悔护肩|忏悔头盔|忏悔护腿| ...... | < - 数据值
^ - 这是我表示查询结果集的微弱尝试。
我想将此表示为一个视图,因此我不必在数据库中有一个不必要且不稳定的表。列名必须来自查询存储项槽名称的查找表。有没有办法以编程方式定义这样的视图?动态SQL可能吗?我很乐意避免......
答案 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端使您的生活更轻松,但查询本身需要使用您想要的实际列名进行编程。
有三种方法可以做到这一点:
答案 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数据立方体之类的东西。