救命呀!创建索引视图问题.在线等,召唤大侠回复!!!!

renwanly 2007-06-01 11:51:06
在线等,非常急!!!!召唤大侠回复!!!!
一、存在四个表如下:
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)
------------------------------------------
在线等,非常急!!!!召唤大侠回复!!!!
...全文
273 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgzaaa 2007-06-03
  • 打赏
  • 举报
回复
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
CathySun118 2007-06-03
  • 打赏
  • 举报
回复
不会,帮顶
renwanly 2007-06-01
  • 打赏
  • 举报
回复
CSDN把表的TAB给去掉了,现在加上:
一、存在四个表如下:
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
------------------------------------------
wgzaaa 2007-06-01
  • 打赏
  • 举报
回复
要干活,没时间看,帮ding
renwanly 2007-06-01
  • 打赏
  • 举报
回复
没有人会解决,
大家也要帮忙把问题顶一下呀!跪求了!

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧