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

急邮件多表关联的sql存储过程,想了很久写不出,sql大神们

2014-01-22 
急急急!邮件多表关联的sql存储过程,想了很久写不出,求助sql大神们想了一个sql存储过程想了很久都写不出,求

急急急!邮件多表关联的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        小红,小李
*/

热点排行