日期:2014-05-18  浏览次数:20715 次

请教大侠帮忙,以下的sql怎么写?
--历史记录表
create table call
(
callerid varchar(20),-- 主叫分机号
incalltime datetime,--打入时间
ansdtime datetime,--接起时间
uptime datetime,-- 挂断时间
talkdur int,--通话时间
agentid varchar(20), -- 被叫工号 
extno varchar(20) --被叫分机号 
)

--登录记录表
create table agentlog
(
agentid varchar(20),--工号 和operator表关联
extno varchar(20),--分机号
logintime datetime,--登录时间
legouttime datetime,--登出时间
)


--用户表
create table operator
(
uid varchar(20),--工号
passwords varchar(20),--密码
username varchar(20),--用户名
)

我现在要查出电话内线拨打记录的( 主叫工号、主叫用户名、主叫分机号、被叫工号、被叫用户名、被叫分机号、
接起时间、挂断时间、通话时间 )记录。
请问这个sql 怎么写?

查询出来显示如下:

主叫工号 主叫用户名 主叫分机号 被叫工号 被叫用户名 被叫分机号 接起时间 挂断时间 通话时间
6001 张三 8082 6003 李四 8085 2011-03-09 09:57:21 2011-03-09 09:57:33 12
6003 李四 8085 6002 小五 8083 2011-03-09 10:12:23 2011-03-09 10:12:33 10
6003 李四 8085 6001 张三 8082 2011-03-09 10:16:33 2011-03-09 10:16:38 5





------解决方案--------------------
数据库设计有冗余了,而且可能会产生冲突,不应有"被叫工号"列.
查询:

SQL code
select b.agentid,c.username,a.callerid,d.agentid,e.username,a.agentid,a.ansdtime,a.uptime,a.talkdur
from call a inner join agentlog b on a.callerid=b.extno
inner join operator c on b.agentid=c.uid
inner join agentlog d on a.extno=d.extno
inner join operator e on d.agentid=e.uid

------解决方案--------------------
SQL code
select *
from
(select
   a.callerid,b.extno,c.username
from
   call a join agentlog
on
   a.callerid=b.extno
join
   operator c
on
   b.agentid=c.uid
)a
join
(

select
   a.agentid,a.extno,a.ansdtime,a.uptime,a.talkdur,c.username
from
      call a join agentlog
on
   a.callerid=b.extno
join
   operator c
on
   b.agentid=c.uid
)b
on
 a.agentid=b.agentid