有3张 表 basicinfor ,guoshui ,dishui 
现在要根据 ename 和 trtime 查询 guoshui 里面所有的字段,dishui 里面所有的字段,basicinfor 里面的units1,units2,units3三个字段。
 
3个表 中都有ename 这个字段。guoshui ,dishui 中的ename 肯定来源basicinfor这个表, 
guoshui 和dishui  有trtime 字段。
create table guoshui(
gsid int,
codeid varchar(50),
ename varchar(50),
zzspt float, 
transtime varchar(50)
)create table dishui(
dsid int, 
codeid varchar(50), 
ename varchar(50),
cjr float,
trtime varchar (50)
)create table basicinfor(
eid int,
ename varchar(50),
eaddress varchar(50), 
units1 varchar(50), 
units2 varchar(50),
units3 varchar(50), 
)insert into dishui values(1,'320012','机械厂',3400.99,'2009-02') 
insert into dishui values(2,'320013','得力纺织厂',5400.00,'2010-02') 
insert into dishui values(3,'320014','实木有限公司',7800.00,'2009-02') 
insert into dishui values(4,'320015','维维有限公司',2400.55,'2009-02') insert  into guoshui values(1,'520010','机械厂',23444.99,'2009-02') 
insert  into guoshui values(2,'520012','得力纺织厂',454.00,'2009-02') 
insert  into guoshui values(3,'520013','壳牌燃油',895.99,'2009-02') insert into basicinfor values(1,'机械厂','南京','古铜县','江宁县','江浦县') 
insert into basicinfor values(2,'得力纺织厂','南京','古铜县','','') 
insert into basicinfor values(3,'实木有限公司','南京','古铜县','','') 
insert into basicinfor values(4,'维维有限公司','南京','古铜县','江宁县','江浦县') 
insert into basicinfor values(5,'壳牌燃油','南京','古铜县','','') 
当我查询条件是 trtime ='2010-02' 的时候显示的结果是
units1 units2 units3 gsid codeid ename zzspt transtime dsid codeid ename     cjr     trtime 古铜县                  NULL NULL   NULL  NULL   NULL      2   320013 得力纺织厂 5400.00 2010-02
如果我查询条件是 ename='壳牌燃油' 显示的结果是:
units1 units2 units3 gsid codeid ename   zzspt transtime dsid codeid ename cjr   trtime 古铜县  江宁县  江浦县  3    520013 壳牌燃油 895.99 2009-02   NULL NULL  NULL   NULL  NULL
如果我查到是 ename='机械厂' 和 trtime ='2009-02' (追加 条件 我会用java 自己动态拼接 ,只要写出sql 就行)
units1 units2 units3 gsid codeid ename   zzspt  transtime dsid codeid ename  cjr     trtime 古铜县  江宁县  江浦县  1    520010 机械厂 23444.99 2009-02    1    320012 机械厂 3400.99 2009-02guoshui 表里面 ename 有可能不满足条件,那么要让查询记录里面 guoshui这张表的部分显示null,dishui里面的ename如果满足条件 那么就显示值。同样 
如果 不满足 trtime 条件的那张表显示null ,瞒足条件的 那张 表显示数据
可能guoshui不满足 也有可能是 dishui这张表不满足 ,如果哪个表不满足条件就用null 填充,满足的显示数据,如果都满足就全部显示,如果都不满足条件 肯定是不显示那条数据了。
就要实现这样的功能3个表 中都有ename 这个字段。
guoshui 和dishui 有trtime 字段。

解决方案 »

  1.   

    select * from basicinfor a full outer join guoshui b
    on a.ename=b.ename full outer join dishui c
    on a.ename=c.ename
      

  2.   

    -->By Tony 2009-02-10 
    ----------------------------------------- 
    select isnull(t1.units1,t2.units1) units1,isnull(t1.units2,t2.units2) units2,isnull(t1.units3,t2.units3) units3, 
          t1.gsid,t1.codeid,t1.ename,t1.zzspt,t1.transtime,t2.dsid,t2.codeid,t2.ename,t2.cjr,t2.trtime 
    from 
        ( 
          select a.units1,a.units2,a.units3,b.gsid,b.codeid,b.ename,b.zzspt,b.transtime 
          from basicinfor a join guoshui b on a.ename=b.ename 
          ) t1 
        full join 
        ( 
          select a.units1,a.units2,a.units3,c.dsid,c.codeid,c.ename,c.cjr,c.trtime 
          from basicinfor a join dishui c on a.ename=c.ename    
          ) t2 
          on t1.ename = t2.ename and t1.transtime = t2.trtime 
    where (t2.trtime='2010-02') or 
          isnull(t1.ename,t2.ename)='壳牌燃油' or 
        (isnull(t1.ename,t2.ename)='机械厂' and t2.trtime ='2009-02' ) 
    ------------------------------------------------
      

  3.   

    单个WHERE条件就是你单个问题的结果.
      

  4.   

    --1)trtime = '2010-02'
    select *  from basicinfor a full join 
    (
    select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime,c.*  from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.trtime
    )t on a.ename = isnull(t.ename ,t.b_ename)
    where trtime = '2010-02'--2)a.ename='壳牌燃油'
    select *  from basicinfor a full join 
    (
    select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime,c.*  from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.trtime
    )t on a.ename = isnull(t.ename ,t.b_ename)
    where a.ename='壳牌燃油'
    --3)ename='机械厂' 和 trtime ='2009-02' 
    select *  from basicinfor a full join 
    (
    select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime,c.*  from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.trtime
    )t on a.ename = isnull(t.ename ,t.b_ename)
    where  a.ename='机械厂' and trtime ='2009-02'
    结果就不粘了,跟楼主的需要一样
      

  5.   


    create table guoshui(
    gsid int,
    codeid varchar(50),
    ename varchar(50),
    zzspt float, 
    transtime varchar(50)
    )create table dishui(
    dsid int, 
    codeid varchar(50), 
    ename varchar(50),
    cjr float,
    trtime varchar (50)
    )create table basicinfor(
    eid int,
    ename varchar(50),
    eaddress varchar(50), 
    units1 varchar(50), 
    units2 varchar(50),
    units3 varchar(50), 
    )insert into dishui values(1,'320012','机械厂',3400.99,'2009-02') 
    insert into dishui values(2,'320013','得力纺织厂',5400.00,'2010-02') 
    insert into dishui values(3,'320014','实木有限公司',7800.00,'2009-02') 
    insert into dishui values(4,'320015','维维有限公司',2400.55,'2009-02') insert  into guoshui values(1,'520010','机械厂',23444.99,'2009-02') 
    insert  into guoshui values(2,'520012','得力纺织厂',454.00,'2009-02') 
    insert  into guoshui values(3,'520013','壳牌燃油',895.99,'2009-02') insert into basicinfor values(1,'机械厂','南京','古铜县','江宁县','江浦县') 
    insert into basicinfor values(2,'得力纺织厂','南京','古铜县','','') 
    insert into basicinfor values(3,'实木有限公司','南京','古铜县','','') 
    insert into basicinfor values(4,'维维有限公司','南京','古铜县','江宁县','江浦县') 
    insert into basicinfor values(5,'壳牌燃油','南京','古铜县','','') 
    ---------
    select * from dishui a full join guoshui b on a.cjr=b.codeid 
                       full join basicinfor c on a.cjr=c.eid
                    where a.trtime='2010-02'
    drop table dishui
    drop table guoshui
    drop table basicinfor
      

  6.   

    1楼和7楼的一样 都是给我连接查询,我不会不知道外联查询,关键是加了条件你们试过了吗??????+ename 和transtime 条件怎么加? 条件不是加在后面就能出来的。
      

  7.   

    9楼,你那样查 不管是什么条件 (enanme 的话一样) 有半边群是null 
      

  8.   

    就7楼写的答案 是对的,但是还是存在一个问题 
    时间条件 不是一定是 dishui 里面的 trtime ='2010-02' 也有可能 是guoshui 里面的transtime 满足第一句和最后一句 
    select *  from basicinfor a full join 
    (
        select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime,c.*  from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.trtime
    )t on a.ename = isnull(t.ename ,t.b_ename)
    where  a.ename='机械厂' and trtime ='2009-02'  应该改成
     
    //  表中 trtime  和实际表中 transtime 不一样为  删了从建 
    drop table dishui;create table dishui(
    dsid int, 
    codeid varchar(50), 
    ename varchar(50),
    cjr float,
    transtime varchar (50)
    )//一下 是我实际测试的sql 代码
    select *  from basicinfor a full join 
    (
        select b.gsid,b.codeid as b_codeid,b.ename as b_ename,b.zzspt,b.transtime as b_transtime,c.*  from guoshui b full join dishui c on b.ename = c.ename and b.transtime = c.transtime
    )t on a.ename = isnull(t.ename ,t.b_ename)
    where (transtime = '2009-03' and a.ename='机械厂') or (b_transtime ='2009-03' and a.ename='机械厂')
    其实昨天自己也写了个 sql 比7楼的 更方便取得需要的字段
    select b.units,b.units2,b.units3,g.*,d.* 
     from basicinfor as b
    left join guoshui as g on b.ename=g.ename and g.ename='机械厂' and g.transtime='2009-02'
    left join dishui as d on b.ename=d.ename and d.ename='机械厂' and d.transtime='2009-02'
    where (d.ename='机械厂' and d.transtime='2009-02') or (g.ename='机械厂' and g.transtime='2009-02')开始 我是写到 
    select b.units,b.units2,b.units3,g.*,d.* 
     from basicinfor as b
    left join guoshui as g on b.ename=g.ename 
    left join dishui as d on b.ename=d.ename 
    where (d.ename='机械厂' and d.transtime='2009-02') or (g.ename='机械厂' and g.transtime='2009-02')
    查出来的总是不对 所以才发贴过来询问。
    那知道 总是有人告诉我 左联,联合,或者就写个 不加条件的联合查询 ,那有什么用呢?