Создайте индексированное представление с самостоятельным соединением - PullRequest
4 голосов
/ 08 апреля 2011

Я хотел бы создать индексированное представление (на 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 и не нашел способа обойти проблему самосоединения.Есть ли способ, как это сделать?Или как мне переписать запрос для получения правильных результатов?

Спасибо!

1 Ответ

7 голосов
/ 08 апреля 2011

Вы не можете иметь самостоятельное объединение в индексированном представлении - это просто невозможно (я думаю, что самостоятельное объединение делает обновление индекса слишком сложным для правильной работы).

См. Эту ссылку Создание индексированного представления с самосоединением (Kinda) , где приведены некоторые советы о том, как можно реструктурировать запрос, чтобы обойти это.

...