求我这种多表查询语句应该如何写

wchis 2012-06-29 10:35:22
表很多,有5张表,其中A B C D四个表都只有 YHID(用户ID) ZS(总数) F表是YHID XM(姓名),
我想统计A B C D这四个表的全部数据,如果其中某个表没有这个YHID,而其他表有,在ZS里用0表示,我试过关联
select f.xm,nvl(a.zs,0),nvl(b.zs,0),nvl(c.zs,0),nvl(d.zs,0),a.zs+b.zs+c.zs+d.zs from A,B,C,D,F where a.yhid=b.yhid and a.yhid=f.yhid .....
这些 只得到很少量数据,而我试着用左连接时候,发现由于这ABCD四个表里,YHID不一致,有些表里的YHID有些表里就不一定有,比如A表有104条记录,B表有90条记录,C表有85条记录,D表有67条记录,但是YHID这个不一定是记录多的就一定包括住记录少的,全部无重复加起来是有120来条记录的,所以无法进行左连接,,我想把这里面全部的120条记录都取出来,得到的结果中YHID都全部齐全,ZS里如果是NULL的变为0,这样能做到吗?如何做到,跪求大神帮忙
...全文
104 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
horizonlyhw 2012-06-29
  • 打赏
  • 举报
回复
你理解错了

with as 是我做个例子数据


你直接用select那段 就行了

select c.na,nvl(a.num,0),nvl(b.num,0)
from a,b,c
where a.id(+) = c.id
and b.id(+) = c.id


把abc 换成你对应的表
wchis 2012-06-29
  • 打赏
  • 举报
回复
按照你给我语句,我运行了,怎么出现上千条记录的啊,能不能帮我看下,我哪里错了

with a as
(select yzyhid id,zs num from vi_mzypyztj
union all
select yzyhid id,zs num from vi_mzhyyztj),
b as (select yzyhid id,zs num from vi_mzypyztj
union all
select yzyhid id,ZS num from vi_mzsqdyz02),
c as (select yzyhid id,zs na from vi_mzypyztj
union all
select yzyhid id,ZS na from vi_mzhyyztj
union all
select yzyhid id,ZS na from vi_mzsqdyz02)

select c.na,nvl(a.num,0),nvl(b.num,0) from a,b,c where a.id(+)=c.id and b.id(+)=c.id
horizonlyhw 2012-06-29
  • 打赏
  • 举报
回复
就模拟了3个表,意思是一样的

with a as (
select '1' id,7 num from dual
union all
select '2' id,8 num from dual
),
b as (
select '1' id,9 num from dual
union all
select '3' id,10 num from dual
),
c as (
select '1' id,'AA' na from dual
union all
select '2' id,'BB' na from dual
union all
select '3' id,'CC' na from dual
)

select c.na,nvl(a.num,0),nvl(b.num,0)
from a,b,c
where a.id(+) = c.id
and b.id(+) = c.id
wchis 2012-06-29
  • 打赏
  • 举报
回复
谢谢2楼,已经可以了,也谢谢其他人帮忙
qq804927505 2012-06-29
  • 打赏
  • 举报
回复
试试这个:
SELECT f.xm, nvl(a.zs, 0) FROM a WHERE a.yhid=f.yhid
UNION
SELECT f.xm, nvl(b.zs, 0) FROM b WHERE b.yhid=f.yhid
UNION
SELECT f.xm, nvl(c.zs, 0) FROM c WHERE c.yhid=f.yhid
UNION
SELECT f.xm, nvl(d.zs, 0) FROM d WHERE d.yhid=f.yhid
xyk_king 2012-06-29
  • 打赏
  • 举报
回复
这么说F表应该有所有用户并且不重复是吧
这样的话可以用F表做主表,除了姓名之外的其他字段都用子查询实现
例如

SELECT XM,
(SELECT NVL(ZS,0) FROM A WHERE YHID = F.YHID),
(SELECT NVL(ZS,0) FROM B WHERE YHID = F.YHID),
(SELECT NVL(ZS,0) FROM C WHERE YHID = F.YHID),
(SELECT NVL(ZS,0) FROM D WHERE YHID = F.YHID),
(SELECT NVL(ZS,0) FROM A WHERE YHID = F.YHID) +
(SELECT NVL(ZS,0) FROM B WHERE YHID = F.YHID) +
(SELECT NVL(ZS,0) FROM C WHERE YHID = F.YHID) +
(SELECT NVL(ZS,0) FROM D WHERE YHID = F.YHID)
FROM F
siriusraider 2012-06-29
  • 打赏
  • 举报
回复
2楼正解啊
你需要用F表的id与其他各表相连就行,不需要对每个表的id都进行匹配。

看一下外连接
LengYueFengCai 2012-06-29
  • 打赏
  • 举报
回复
提供一种方法,自己去验证。表a与表b全连接作为表ab,然后ab表和c表全连接作为abc表,然后abc表与d表全连接得到你想要数据。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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