日期:2014-05-18  浏览次数:20476 次

救命呀!创建索引视图问题.在线等,召唤大侠回复!!!!
在线等,非常急!!!!召唤大侠回复!!!!
一、存在四个表如下:
1.会话表dbo.tdimDialog
------------------------------------------
会话ID nID bigint
...
------------------------------------------
2.会话参与者dbo.tdimDialogParter
------------------------------------------
会话ID nIDMast bigint
流水号 nIDDt bigint
参与者id nParterID bigint
最后读取时间戳 dReadLast datetime
------------------------------------------
3.会话消息dbo.tdimDialogDt
----------------------------
会话ID nIDMast bigint
消息流水号 nIDDt bigint
发出者ID nSenderID bigint
消息内容 cMsg varchar(255)
发出时间 dSend datetime
------------------------------------------
4.会话消息接收者dbo.tdimDialogDtReceiver
------------------------------------------
消息流水号 nIDDt bigint
流水号 nIDDtDt bigint
接收者ID nReceiverID bigint
------------------------------------------
二、需要创建一个可以创建唯一索引的视图,
视图需要实现显示未读消息,逻辑为:
(接收者已参与会话&最后读取时间戳 <=发出时间)|(接收者未参与会话)
三、我已实现如下视图,但包含一些元素导致无法创建唯一索引,如UNION和子查询。
如果用UNION的前部分创建视图是可以建立唯一索引的,但这也仅仅是解决了UNION问题,
而没有解决子查询问题。视图语法如下:
------------------------------------------
create   view   vMsgUnread   WITH   SCHEMABINGING  
as
select
  接收者.nReceiverID,
  消息.nSenderID,
  会话.nID,
  消息.nIDDt,
  消息.cMsg,
  消息.dSend
FROM   dbo.tdimDialog   会话  
  INNER   JOIN   dbo.tdimDialogDt   消息  
        ON   会话.nID   =   消息.nIDMast  
  INNER   JOIN   dbo.tdimDialogDtReceiver   接收者  
        ON   消息.nIDDt   =   接收者.nIDDt  
  INNER   JOIN   dbo.tdimDialogParter   参与者  
        ON   会话.nID   =   参与者.nIDMast  
              AND   接收者.nReceiverID   =   参与者.nParterID  
              AND   消息.dSend   > =   参与者.dReadLast  
UNION  
select
  接收者.nReceiverID,
  消息.nSenderID,
  会话.nID,
  消息.nIDDt,
  消息.cMsg,
  消息.dSend
FROM   dbo.tdimDialog   会话  
  INNER   JOIN   dbo.tdimDialogDt   消息  
        ON   会话.nID   =   消息.nIDMast  
  INNER   JOIN   dbo.tdimDialogDtReceiver   接收者  
        ON   消息.nIDDt   =   接收者.nIDDt  
WHERE   NOT   EXISTS(SELECT   1   FROM   dbo.tdimDialogParter   参与者  
                          WHERE   参与者.nIDMast=会话.nID   AND   参与者.nParterID=接收者.nReceiverID)
------------------------------------------
需要创建唯一索引语法如下:
------------------------------------------
create   unique   clustered   index   IDXC_vMsgUnread
  ON   vMsgUnread(nReceiverID,   nSenderID,   nID,   nIDDt)
------------------------------------------
在线等,非常急!!!!召唤大侠回复!!!!


------解决方案--------------------
要干活,没时间看,帮ding
------解决方案--------------------
不会,帮顶
------解决方案--------------------
union 和子查询 都是限制条件,只有改写查询 试试下面的不知查询结果如何
create view vMsgUnread WITH SCHEMABINGING as
select 接收者.nReceiverID,消息.nSenderID,会话.nID,消息.nIDDt,消息.cMsg,消息.dS