首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

救命呀!创建索引视图有关问题.召唤大侠回复!

2012-04-01 
救命呀!创建索引视图问题.在线等,召唤大侠回复!!!!在线等,非常急!!!!召唤大侠回复!!!!一、存在四个表如下:1

救命呀!创建索引视图问题.在线等,召唤大侠回复!!!!
在线等,非常急!!!!召唤大侠回复!!!!
一、存在四个表如下:
1.会话表dbo.tdimDialog
------------------------------------------
会话IDnIDbigint
...
------------------------------------------
2.会话参与者dbo.tdimDialogParter
------------------------------------------
会话IDnIDMastbigint
流水号nIDDtbigint
参与者idnParterIDbigint
最后读取时间戳dReadLastdatetime
------------------------------------------
3.会话消息dbo.tdimDialogDt
----------------------------
会话IDnIDMastbigint
消息流水号nIDDtbigint
发出者IDnSenderIDbigint
消息内容cMsgvarchar(255)
发出时间dSenddatetime
------------------------------------------
4.会话消息接收者dbo.tdimDialogDtReceiver
------------------------------------------
消息流水号nIDDtbigint
流水号nIDDtDtbigint
接收者IDnReceiverIDbigint
------------------------------------------
二、需要创建一个可以创建唯一索引的视图,
视图需要实现显示未读消息,逻辑为:
(接收者已参与会话&最后读取时间戳 <=发出时间)|(接收者未参与会话)
三、我已实现如下视图,但包含一些元素导致无法创建唯一索引,如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,消息.dSend


FROM dbo.tdimDialog 会话
INNER JOIN dbo.tdimDialogDt 消息
ON 会话.nID = 消息.nIDMast
INNER JOIN dbo.tdimDialogDtReceiver 接收者
ON 消息.nIDDt = 接收者.nIDDt
left JOIN dbo.tdimDialogParter 参与者
ON 会话.nID = 参与者.nIDMast AND 接收者.nReceiverID = 参与者.nParterID
where 消息.dSend > = 参与者.dReadLast or 参与者.nParterID is null

热点排行