关于right join外连接的sql问题(100分)

  • 主题发起人 主题发起人 sweidong
  • 开始时间 开始时间
S

sweidong

Unregistered / Unconfirmed
GUEST, unregistred user!
表 b1
pz 数量 等级
1 25 1
1 30 1
2 40 1
4 10 1
表 b2
pz 品种
1 苹果
2 桔子
3 香蕉
4 西瓜
我想得到如下结果:
苹果 55
桔子 40
香蕉
西瓜 10
我写sql:select b2.品种,sum(b1.数量)
from b1 right join b2 on b1.pz=b2.pz
where b1.等级=1
group by b2.品种
为啥只得到如下结果:
苹果 55
桔子 40
西瓜 10
 
select t1.pz,Sum(IsNull(t2.数量,0)) as 数量 from table1 t1 left outer join table2 t2 on t1.pz=t2.pz group by t1.pz
SQL2000下测试通过。
 
on的时候已经把香蕉过滤掉了吧。
 
t1是第二个表
t2是第一个表
 
在sum()中加上isnull()
 
我的使用环境:winxp+delphi7+ado连access2000
关键是去掉where可以实现,加上where子句就不行?请指教!
 
语句种没有where啊?
 
select b2.品种,sum(b1.数量)
from b1 right join b2 on b1.pz=b2.pz
where b1.等级=1
group by b2.品种
请大哥帮忙看看,小弟很是着急~
 
我觉得这个SQL语句用RIGHT JOIN一下子是写不出来的,原因是你有个等级相同的品种的过滤,所以,像香蕉就给过滤掉了。你可以分两步来的:
①先执行个RIGHT JOIN,把符合条件的选择出来。
②把类似香蕉的特殊品种加在第①步的数据集后面。
可以用CURSOR来实现。
 
select b2.品种,sum(b1.数量)
from b1 right join b2 on b1.pz=b2.pz
where b1.等级=1 or b1.pz is null
group by b2.品种
 
是where b1.等级=1 的关系
按你的SQL得到的 应该是
tab1.pz tab1.数量 tab1. 等级 tab2.pz tab2.品种
null null null 3 香蕉
而你的where b1.等级=1是不把这条给过滤掉了
应该这么写
select b2.品种,sum(b1.数量)
from (select * from b1 where 等级=1) b1 right join b2 on b1.pz=b2.pz
group by b2.品种
 
谢谢foxyxyan,接受答案
 
后退
顶部