sql server 2012中的相关查询

时间:2014-02-07 12:21:14

标签: sql-server-2012

不太确定如何编写此查询,我认为有人会非常友好地帮助我。

我有两个表(为了安全起见,列名已被更改):

消息表

的MessageID carbon_copy_id 发件人ID recipientid

carbon_copy表

carbon_copy_id member_id

基本上我正在编写一个允许复制的电子邮件系统。

  • 当成员向一个收件人发送邮件时,它会将一条记录写入邮件表,并将carbon_copy_id保留为空。
  • 当会员发送包含多个收件人的电子邮件时,例如2个收件人, 我将两个记录插入到碳复制表中,并使用相同的carbon_copy_id和每个收件人的member_id。然后,我将两个消息记录插入到消息表中,每个接收者一个消息记录,并将共享的carbon_copy_id插入到碳复制表中。

    选择     mt.messageid,     mt.carbon_copy_id,     oa.member_list 从     message_table mt     外部应用(选择东西((选择','+强制转换(cc.member_id为varchar)                                来自carbon_copy cc                                其中cc.carbon_copy_id = mt.carbon_copy_id                                按cc.member_id排序                                for xml path(''),TYPE).value('。','varchar(max)'),1,2,''))oa(member_list) 哪里     messageid = id_of_message 订购     messageid desc

我需要这个是一个记录,其成员列表中的副本不是空的,一个记录没有它,而它是空的。

但是,鉴于上面概述的范例,这将产生插入的两个记录的列表。我要做的是让结果集将两个记录合并为一个并返回一个逗号分隔的carbon_copied成员id列表,其中消息记录中的carbon_copy_id不为空。

这个想法是返回一个消息列表,而不是在复制消息时显示重复消息。与GMAIL的表现类似。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

首先,从设计的角度来看,将消息表外键绑定到cc表似乎是落后的。它应该是另一种方式,cc表引用要为其存储其他收件人的邮件的messageid。

那就是说,无论哪种方式,你真的应该在这里使用两个查询 - 一个用于消息,一个用于cc'd接收者列表。这是一个比使用表设计返回逗号分隔列表更好的解决方案。