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

重开贴:向大侠一个貌似简单的连接查询

2012-02-27 
重开贴:向大侠求助一个貌似简单的连接查询以下是我昨天的帖子有两个表表ta三个字段:流程号p_nbr,交易号t_n

重开贴:向大侠求助一个貌似简单的连接查询
以下是我昨天的帖子

有两个表 

表ta三个字段:流程号p_nbr,交易号t_nbr,交易内容fulltext 

(一个流程中可能有多次交易) 

表tb三个字段:流程号p_nbr,交易号t_nbr,交易责任人response 

(一个流程的交易责任人可能多次更改,tb中的交易号代表是在第几次更改的) 

例: 

ta:  

p_nbr t_nbr fulltext  

12345 2 XXX 

12345 7 XXX

45678 1 XXX

tb: 

p_nbr t_nbr response 

12345 1 a 

12345 5 b 

12345 8 c 

45678 1 a

45678 3 d

也就是说流程12345的1-4次交易的责任人是a,5-7次的是b,8次以后的是c;那么ta中12345第二次交易的责任人应为a;第7次交易的责任人应为b 

同理 45678 第一次交易的责任人是a
 


当时有事匆忙结贴,今天仔细看看可能是我没说清——我需要连接后得到类似这样的表

p_nbr (a.)t_nbr response  

12345 2 a

12345 7 b

45678 1 a


请大侠支招,谢谢!!





[解决办法]

SQL code
create table ta(p_nbr varchar(10), t_nbr int, fulltext varchar(10))insert into ta values('12345', 2, 'XXX') insert into ta values('12345', 7, 'XXX') insert into ta values('45678', 1, 'XXX')create table tb(p_nbr varchar(10), t_nbr int, response varchar(10))insert into tb values('12345', 1, 'a' ) insert into tb values('12345', 5, 'b' ) insert into tb values('12345', 8, 'c' ) insert into tb values('45678', 1, 'a' )insert into tb values('45678', 3, 'd' )goselect a.p_nbr,a.t_nbr,b.response from ta a,(  select m.p_nbr , m.t_nbr t_nbr1, isnull(n.t_nbr,m.t_nbr+1) t_nbr2, m.response from  (select px=(select count(1) from tb where p_nbr=a.p_nbr and t_nbr<a.t_nbr)+1 , * from tb a) m left join  (select px=(select count(1) from tb where p_nbr=a.p_nbr and t_nbr<a.t_nbr)+1 , * from tb a) n  on m.p_nbr = n.p_nbr and m.px = n.px - 1) bwhere a.p_nbr = b.p_nbr and a.t_nbr >= b.t_nbr1 and a.t_nbr < b.t_nbr2drop table ta,tb/*p_nbr      t_nbr       response---------- ----------- ----------12345      2           a12345      7           b45678      1           a(3 行受影响)*/
[解决办法]
SQL code
create table DoNoPoA(p_nbr      varchar(10),t_nbr        int,fulltext      varchar(10))create table DoNoPoB(p_nbr      varchar(10),t_nbr        int,response         varchar(10))delete DoNoPoBdelete DoNoPoAinsert into DoNoPoAselect '12345'      ,     2              ,                 'XXX'   union all select '12345'    ,       7               ,              ' XXX'   union all select '12345'    ,       9               ,              ' XXX'   union all select '45678'    ,       1              ,                 'XXX' insert into DoNoPoBselect '12345'     ,      1       ,                    'a'   union all select'12345'     ,      5               ,            'b'    union all select'12345'      ,     8             ,              'c'    union all select'12345'      ,     12            ,              'D'    union all select'45678'      ,     1             ,             'a'  union all select'45678'       ,    3              ,            ' d' select  A.p_nbr ,A.t_nbr, B.response from (    select A.p_nbr,A.t_nbr,max(B.t_nbr) as t_nbrB    from DoNoPoA A left join DoNoPoB B    on A.p_nbr= B.p_nbr where A.t_nbr  > = B.t_nbr            group by A.p_nbr ,A.t_nbr )  A left join DoNoPoB Bon A.p_nbr = B.p_nbr where  A.t_nbrB= B.t_nbr/*-------------------p_nbr   t_nbr  response 12345    2    a12345    7    b12345    9    c45678    1    a*/
[解决办法]
SQL code
 
/*


先求出B 表中 小于 A 表 的 t_nbr
*/
select A.p_nbr,A.t_nbr, B.t_nbr
from DoNoPoA A left join DoNoPoB B
on A.p_nbr= B.p_nbr where A.t_nbr  > = B.t_nbr


/*
再通过 group by  A.p_nbr ,A.t_nbr 求出 , B 表中 小于 A 表 的 t_nbr 的最大的t_nbr
*/
select A.p_nbr,A.t_nbr,max(B.t_nbr) as t_nbrB
from DoNoPoA A left join DoNoPoB B
on A.p_nbr= B.p_nbr where A.t_nbr  > = B.t_nbr
group by A.p_nbr ,A.t_nbr


/*
再次通过 和 B 表 连接 求出 response
*/
select  A.p_nbr ,A.t_nbr, B.response
from (
select A.p_nbr,A.t_nbr,max(B.t_nbr) as t_nbrB
from DoNoPoA A left join DoNoPoB B
on A.p_nbr= B.p_nbr where A.t_nbr  > = B.t_nbr
    group by A.p_nbr ,A.t_nbr )  A
left join
DoNoPoB B
on A.p_nbr = B.p_nbr where  A.t_nbrB= B.t_nbr


热点排行