create table ta
(
 aid int,
 constraint pk_ta_aid primary key (aid)
)
create table tb
(
 bid int, 
 aid int,
 constraint pk_tb_bid primary key (bid),
 constraint fk_tb_aid foreign key (aid) references ta(aid)
)
create table tc
(
 cid int, 
 aid int,
 constraint pk_tc_cid primary key (cid),
 constraint fk_tc_aid foreign key (aid) references ta(aid)
)insert into ta values(1)
insert into ta values(2)insert into tb values(1 , 1)
insert into tb values(2 , 1)
insert into tb values(3 , 2)insert into tc values(1 , 1)
insert into tc values(2 , 2)
insert into tc values(3 , 2)我想查询出 这样的结果aid bnums cnums
 1    2     1
 2    1     2我是这样写的:SELECT v1.aid,v1.bnum,v2.cnum FROM
(SELECT  ta.aid, COUNT(tb.bid) AS bnum
FROM  ta LEFT OUTER JOIN tb ON ta.aid = tb.aid
GROUP BY ta.aid) v1 inner join 
(SELECT ta.aid, COUNT(tc.cid) AS cnum
FROM ta LEFT OUTER JOIN tc ON ta.aid = tc.aid
GROUP BY ta.aid)v2
ON v1.aid=v2.aid但是总认为不好,求更好的语句,谢谢

解决方案 »

  1.   

    select ta.aid,
           bnums = isnull((select count(1) from tb where tb.aid = ta.aid),0),
           cnums = isnull((select count(1) from tc where tc.aid = ta.aid),0)
    from ta
    /*
    aid         bnums       cnums       
    ----------- ----------- ----------- 
    1           2           1
    2           1           2(所影响的行数为 2 行)
    */感谢楼主写好的测试语句.
      

  2.   

    select aid,bnums=sum(case when flag='b' then 1 else 0 end),
    bnums=sum(case when flag='c' then 1 else 0 end)
    from(
    select *,flag='b' from tb union all
    select *,flag='c' from tc)g
    group by aid/*
    aid         bnums       bnums       
    ----------- ----------- ----------- 
    1           2           1
    2           1           2(所影响的行数为 2 行)*/