救命呀!创建索引视图问题.在线等,召唤大侠回复!!!!
在线等,非常急!!!!召唤大侠回复!!!!
一、存在四个表如下:
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