【问题标题】:Create indexed view with self join使用自联接创建索引视图
【发布时间】:2011-08-01 09:42:38
【问题描述】:

我想为任务创建索引视图(在MSSQL 2008 R2上):获取玩家列表,可以控制英雄。

  • 玩家 (tblPlayer) 有 0-N 个英雄 (tblBattleTarget + tblHero)。
  • 玩家可以加入 0-N 个氏族 (tblMembershipPlayer2PlayerClan)。
  • 玩家可以与同一部落的其他玩家共享英雄(tblHero.Sharing = 2)。

  • 英雄可以由拥有者或部落中的其他玩家控制,拥有者是成员并且英雄可以共享。

我创建了查询:

SELECT
    H.HeroID /*PK of hero*/
    , BT.IDBattleTargetOwner /*ID of owner of hero (player)*/
    , MP2PC_Other.IDPlayer AS IDOtherPlayerByClan /*ID of another player, which can control hero*/
FROM [dbo].[tblPlayer] AS P_Owner /*owner of heroes*/
INNER JOIN [dbo].[tblBattleTarget] AS BT /*"base class" for hero*/
    ON BT.IDBattleTargetOwner = P_Owner.PlayerID
INNER JOIN [dbo].[tblHero] AS H /*hero in game*/
    ON H.HeroID = BT.BattleTargetID
INNER JOIN [dbo].[tblMembershipPlayer2PlayerClan] AS MP2PC_Owner /*hero's owner can be in 0-N clans*/
    ON MP2PC_Owner.IDPlayer = BT.IDBattleTargetOwner
INNER JOIN [dbo].[tblMembershipPlayer2PlayerClan] AS MP2PC_Other /*other players can be in 0-N clans*/
    ON MP2PC_Other.IDPlayerClan = MP2PC_Owner.IDPlayerClan
WHERE H.Sharing = [dbo].[CONST_Sharing_PlayerClan]() /*only heroes shared with clan can be in result*/

但是,当我尝试在视图上创建索引时,出现错误: 无法在视图“mydatabase.dbo.vwHero_SharingWithClan”上创建索引。该视图包含“mydatabase.dbo.tblMembershipPlayer2PlayerClan”上的自联接。 (Microsoft SQL Server,错误:1947)

我在网上搜索了 web 和 sql server 书籍,但没有找到解决自加入问题的方法。有什么方法可以做到这一点吗?或者我应该如何重写查询以获得正确的结果?

谢谢!

【问题讨论】:

    标签: sql sql-server view indexing


    【解决方案1】:

    您不能在索引视图中进行自联接 - 这是不可能的(我猜自联接会使更新索引过于复杂而无法正确执行)。

    请参阅此链接 Creating an Indexed View with a Self-Join (Kinda) ,了解有关如何重新构建查询以解决此问题的一些提示。

    【讨论】:

    • 不错。以前没有见过这个,并且似乎与 OPs 问题陈述非常吻合。
    • 感谢链接,但连接中的所有表都是“生命”表。我不能使用“CASE WHEN”,因为我不知道值。
    • @TcKs - 我建议你重新阅读这篇文章。 WHEN 子句中的表达式基于来自两行的固定表中的行,或者基于以前用作同一个表的两个连接的连接条件的内容。有两行的表是一个新表,要在连接条件中引入(我猜你可以用文字两行联合替换它)。
    • @ Damien_The_Unbeliever:好的,我会重新阅读这篇文章。如果我错过了一些东西并发现它有用,我会很高兴。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2014-09-05
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    相关资源
    最近更新 更多