多表查询去除重复项问题

qingniao8 2009-11-10 01:59:28
有三张表: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
上边的查询后,会出现笛卡尔积的结果,这种情况如何避免???哪位高手指点下!
...全文
221 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingniao8 2009-11-10
  • 打赏
  • 举报
回复
如果分别做a join b , a join c 两张临时表,再两表合并好像也会产生笛卡尔积。。。
qingniao8 2009-11-10
  • 打赏
  • 举报
回复
b,c两张表只有bill_id是相同的,其他的可能相同也可能不同。
xuejie09242 2009-11-10
  • 打赏
  • 举报
回复
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'
xuejie09242 2009-11-10
  • 打赏
  • 举报
回复
在B和C连接的时候,出现多对多的情况,一个ID的条数为B的该ID数目*C该ID的数目,所以是笛卡尔各的情况。
如果不想这样,只能是一对一或者一对多的连接
qingniao8 2009-11-10
  • 打赏
  • 举报
回复
比如同一bill_id结果本来只有四行,现在查询出来却有16行结果
SQL77 2009-11-10
  • 打赏
  • 举报
回复
其中:同一个bill_id 中,b,c行数可能不同,b,c中不足的行用NULL补齐。

是一个对多个是吧,那不算笛卡尔积吧,

如果要去除重复,可用NOT EXISTS
--小F-- 2009-11-10
  • 打赏
  • 举报
回复
这个怎么会出现笛卡尔积?

34,571

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧