select m.id,m.name,dDate as 借款日期,mMoney as 借款金额,dDate2 as 还款日期,mMoney2 as 还款金额
from M,(
select isnull(t1.id,t2.id) as id,t1.dDate,t1.mMoney,t2.dDate as dDate2,t2.mMoney as mMoney2
from t1 full join t2
on t1.id=t2.id and t1.tid=t2.tid
) as t
where m.id=t.id

解决方案 »

  1.   


    create table M
    (
    id int,
    name varchar(10)
    )insert into m values(1,'张三')
    insert into m values(2,'李四')
    insert into m values(3,'王五')
    insert into m values(4,'赵六')create table t1
    (
    id int,
    tid  int,
    ddate datetime,
    mmoney int
    )create table t2
    (
    id int,
    tid  int,
    ddate datetime,
    mmoney int
    )insert into t1 values(1,1,'20040101',50)
    insert into t1 values(1,2,'20040202',100)
    insert into t1 values(2,1,'20031001',1000)
    insert into t1 values(2,2,'20031225',500)
    insert into t1 values(2,3,'20040401',200)
    insert into t1 values(3,1,'20040501',100)insert into t2 values(1,1,'20040102',30)
    insert into t2 values(1,2,'20040215',120)
    insert into t2 values(2,1,'20031101',800)
    insert into t2 values(2,2,'20031228',600)
    insert into t2 values(2,3,'20040415',100)
    insert into t2 values(2,4,'20040420',200)
    --以上为建立测试环境
    select m.id as ID,m.name as 姓名,ttt.date1 as 借款日期, ttt.date2 as 还款日期
    from m left outer join
    (select (case when tab1.id is null then tab2.id else tab1.id end) id,
    tab1.ddate date1,tab2.ddate date2 from
    (select id,tid,ddate,mmoney,
    (select min(t2.ddate) from t2 where t2.ddate>t1.ddate) as ldate
     from t1) tab1 
    full outer join
    (select id,tid,ddate,mmoney,
    (select max(t1.ddate) from t1 where t1.ddate<t2.ddate) as ldate
     from t2) tab2
    on tab1.ldate=tab2.ddate and tab2.ldate=tab1.ddate and tab1.id=tab2.id
    ) ttt on m.id=ttt.id
      

  2.   

    写个最简单的吧
    select m.id,m.name,T1.dDate as 借款日期,T1.mMoney as 借款金额,T2.dDate2 as 还款日期,T2.mMoney2 as 还款金额 from M,T1,T2 where M.id=T1.id and T1.id=T2.id and T1.tid=T2.tid;IS,
      

  3.   

    --忘了两个字段select m.id as ID,m.name as 姓名,ttt.date1 as 借款日期, ttt.money1 as 借款数量,ttt.date2 as 还款日期,ttt.money2 as 还款数量
    from m left outer join
    (select (case when tab1.id is null then tab2.id else tab1.id end) id,
    tab1.ddate date1,tab1.mmoney as money1,tab2.ddate date2, tab2.mmoney as money2 from
    (select id,tid,ddate,mmoney,
    (select min(t2.ddate) from t2 where t2.ddate>t1.ddate) as ldate
     from t1) tab1 
    full outer join
    (select id,tid,ddate,mmoney,
    (select max(t1.ddate) from t1 where t1.ddate<t2.ddate) as ldate
     from t2) tab2
    on tab1.ldate=tab2.ddate and tab2.ldate=tab1.ddate and tab1.id=tab2.id
    ) ttt on m.id=ttt.id
      

  4.   

    to 冒牌,不能用tid作为join的条件吧
      

  5.   

    這個問題 沒這麼簡單.這不是借款與還款的問題.(因為表結購沒有反映 還款 與 借款的關係)這個問題是 互相 借, 再抵的問題應按 Stack 的算法來求必須些過程
      

  6.   

    我希望 Tid,和dDate都不要作为条件!!因为Tid只表示一个顺序,我并没有规定人家必填,有可能中间断开,或为空
    比如 1,2,4,null,6,9dDate也不是必填的字段可能为空!还能不能够查出来???
      

  7.   

    你的有 t2.ddate>t1.ddate 用到它了,我要不以dDate 作条件,只要把它显示出来就行了。还有,全为空的记录就不要了!下面这条记录不要!!!!!!!!!
    4 赵六 NULL NULL NULL NULL