谢谢回复,我改了一下,也不知道说清楚了没有?
表1:
 si_ID      varchar(18) primary key,   /*住院编号*/
 InDate     datetime           /*入院时间*/
 OutDate    datetime           /*出院时间*表2:--病人所用药品
si_id varchar(18)  /*住院编号
gd_ID varchar(20)             /*药品编号
bDate datetime  /*开始日期*/--开始用该药品的时间
eDate datetime /*截止日期*/--停止用该药品的时间表3:--病人所检查项目
si_id varchar(18)  /*住院编号
ci_ID varchar(10)     /*检查项目
dDate datetime   /*检查日期*/是要 根据表1中的‘入院时间’和‘出院时间’为范围,来查询每日所用的表2中的药品,以及表3 中的检查项目,打印出病人的 每个住院日的明细。。即是说,要打印出该病人每天所用的药品和检查的项目,按照一天一天的来划分

解决方案 »

  1.   

    select a.indate,b.gd_id,c.ci_id from 表1 a,表2 b,表3 c where a.si_ID=b.si_id and a.si_ID=c.si_id and (b.bdate between a.indate and a.outdate) and (b.edate between a.indate and a.outdate) and (c.ddate between a.indate and a.outdate)
      

  2.   

    写了一个存储过程,根据一个住院编号获取住院明细,
    没有经过严格测试,仅供参考/*======================================
    调用示例
    EXEC getDetail '123456'
    =======================================*/
    CREATE PROCEDURE getDetail
    @si_id varchar(18) -- 住院编号
    ASdeclare @InDate datetime ,@OutDate datetime
    select @Indate=Indate,@OutDate=OutDate FROM 表1 WHERE si_id=@si_id
    declare @t table(si_ID varchar(18),Aday datetime)while(@InDate<=@OutDate)
    BEGIN
      insert @t select @si_id,@InDate
      set @InDate=DATEADD(dd,1,@InDate)
    ENDSELECT O.si_ID 住院编号,O.Aday 日期,P.gd_id 药品编号,Q.ci_ID 检查项目 
    FROM @t O LEFT JOIN 表2 P ON O.Aday between P.bDate AND P.eDate
    LEFT JOIN 表3 Q ON O.Aday=Q.dDate
      

  3.   

    --结果类似住院编号               日期            药品编号               检查项目              
    ------------------ --------------------------- ------------------ ------
    123                2004-07-29            NULL               NULL
    123                2004-07-30            555                001
    123                2004-07-31            555                002
    123                2004-08-01            555                NULL
    123                2004-08-02            NULL               NULL
    123                2004-08-03            NULL