有三张表:a ,b ,c a: bill_id,bill_no,a_id,c_id,BILL_TYPE
b:b_id,id,qty,price
c:c_id,id,qty,price想得到如下结果:三表联合查询
结果:bill_no,b_id,id,qty,price,c_id,id,qty,price
其中:同一个bill_id 中,b,c行数可能不同,b,c中不足的行用NULL补齐。
select
a.bill_no,
b.b_id,b.id,b.qty,b.price,
                  c.c_id,c.id,c.qty,c.price
  from a 
left join b on(a.a_ID=a.BILL_ID) 
left join c on(c.c_id=a.bill_id) 
where isnull(a.BILL_TYPE,'')='INV016' 

order by bill_no
上边的查询后,会出现笛卡尔积的结果,这种情况如何避免???哪位高手指点下!

解决方案 »

  1.   

    其中:同一个bill_id 中,b,c行数可能不同,b,c中不足的行用NULL补齐。 是一个对多个是吧,那不算笛卡尔积吧,如果要去除重复,可用NOT EXISTS
      

  2.   

    比如同一bill_id结果本来只有四行,现在查询出来却有16行结果
      

  3.   

    在B和C连接的时候,出现多对多的情况,一个ID的条数为B的该ID数目*C该ID的数目,所以是笛卡尔各的情况。
    如果不想这样,只能是一对一或者一对多的连接
      

  4.   

    yiy应该用表B和表C连接
    如要求qty和price都相等的情况下,可以这样写:
    select
    a.bill_no,
    b.b_id,b.id,b.qty,b.price,
                      c.c_id,c.id,c.qty,c.price
      from a
    left join b on(a.a_ID=a.BILL_ID)
    left join c on(c.c_id=b.bill_id and b.qty=c.qty and c.price=b.price)
    where isnull(a.BILL_TYPE,'')='INV016' 
      

  5.   

    b,c两张表只有bill_id是相同的,其他的可能相同也可能不同。
      

  6.   

    如果分别做a join b , a join c 两张临时表,再两表合并好像也会产生笛卡尔积