急急急!邮件多表关联的sql存储过程,想了很久写不出,求助sql大神们
想了一个sql存储过程想了很久都写不出,求助!如下:
现在有两个库三个表:人事库(PMS)的员工基础表(Emps)、OA的邮件表(Mail)和邮件人员关联表(Rel_Mail_Emp)。邮件表和邮件人员关联表是一对多的关系。下面我只把主要的列和数据给出:
人事库Emps表的列和数据:
EmpsID(员工ID) Name(员工姓名)
10086 小明
10085 小王
10083 小红
10084 小李
OA库邮件表(Mail):
MailID(邮件ID) Subject(主题) Connect(内容) CreateTime(发送时间)
1 1111 1的内容 2011-1-1
2 2222 2的内容 2011-1-8
邮件人员关联表(Rel_Mail_Emp):
ID(关联ID) FK_Mail(邮件ID) FK_Sender(发件人ID) FK_Recipients(收件人ID)
1 1 10086 10085
2 1 10086 10083
3 2 10086 10083
3 2 10086 10084
最后查出来的存储过程结果是在列表中显示是:
收件人 主题 发送时间
小王,小红 1111 2011-1-1
小红,小李 2222 2011-1-8
sql方面比较弱...求大神们指点迷津...急
[解决办法]
试试这个:
select stuff(( select ','+e.Name
from Rel_Mail_Emp r
inner join EmpsID e
on r.FK_Recipients =e.EmpsID
where r.FK_Mail = m.MailID
for xml path('')),
1,1,''),
Subject,
CreateTime
from Mail m
----------------------------------------------------------------
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2014-01-21 15:17:30
-- Version:
-- Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
--Dec 28 2012 20:23:12
--Copyright (c) Microsoft Corporation
--Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[Emps]
if object_id('[Emps]') is not null drop table [Emps]
go
create table [Emps]([EmpsID] int,[Name] varchar(4))
insert [Emps]
select 10086,'小明' union all
select 10085,'小王' union all
select 10083,'小红' union all
select 10084,'小李'
--> 测试数据:[OA]
if object_id('[OA]') is not null drop table [OA]
go
create table [OA]([MailID] int,[Subject] int,[Connect] varchar(7),[CreateTime] datetime)
insert [OA]
select 1,1111,'1的内容','2011-1-1' union all
select 2,2222,'2的内容','2011-1-8'
--> 测试数据:[Rel_Mail_Emp]
if object_id('[Rel_Mail_Emp]') is not null drop table [Rel_Mail_Emp]
go
create table [Rel_Mail_Emp]([ID] int,[FK_Mail] int,[FK_Sender] int,[FK_Recipients] int)
insert [Rel_Mail_Emp]
select 1,1,10086,10085 union all
select 2,1,10086,10083 union all
select 3,2,10086,10083 union all
select 3,2,10086,10084
--------------开始查询--------------------------
/*
收件人 主题 发送时间
小王,小红 1111 2011-1-1
小红,小李 2222 2011-1-8
*/
;WITH ym AS (
select name,SUBJECT,createtime
from [Rel_Mail_Emp] a RIGHT JOIN [Emps] b ON a.[FK_Recipients]=b.EmpsID
RIGHT JOIN [OA] c ON a.FK_Mail=c.MailID)
select a.createtime,a.SUBJECT,
stuff((select ','+name from ym b
where b.SUBJECT=a.SUBJECT and b.createtime=a.createtime
for xml path('')),1,1,'') 'name'
from ym a
group by a.createtime,a.SUBJECT
----------------结果----------------------------
/*
createtime SUBJECT name
----------------------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2011-01-01 00:00:00.000 1111 小王,小红
2011-01-08 00:00:00.000 2222 小红,小李
*/