Oracle三个表连接查询

时间:2023-02-13 11:13:52
我有下面三个表分别为库存的初始化表tableA包含wlbh(物料编号),cssl(初始数量)tableB包含wlbh(物料编号) rksl(入库数量) tableC包含wlbh(物料编号) cksl(出库数量) 想利用这三个表来取得库存的数量。
tableA
wlbh  cssl
101    4
301    5
501    6

tableB
wlbh  rksl
101    2
102    4
301    5
101    1

tableC
wlbh  cksl
101    3
102    1
201    5
101    2

我怎样才能得到下面的数据表
wlbh cssl rksl cksl
101   4    3    5
102   0    4    1
201   0    0    5
301   5    5    0
501   6    0    0
也就是,将ABC三个表里面的物料编码都取出来,然后将初始的数量和入库的同种物料的和以及出库的物料的和都查询出来。

拜托了!大侠们。

9 个解决方案

#1


SELECT * FROM tableA,tableB,tableC 
     WHERE A.WLBH = B.WLBH
      AND B.WLBH = C.WLBH

#2


楼主给的数据有问题,
比如:仓库里面没有201,为何入库表里面有201号货物?而且而且201号货物,都没有rksl=0怎么得来的cksl=5?

#3



SQL> with ta as(
  2       select 101 wlbh,4 cssl from dual union all
  3       select 301,5 from dual union all
  4       select 501,6 from dual union all
  5       select 102,0 from dual union all--这两项是我加上的,总觉得不是你的意思
  6       select 201,0 from dual)--说实话,你的表设计的太不合理了,这么大的数据冗余你尽然没发现?
  7  ,tb as(
  8      select 101 wlbh,2 rksl from dual union all
  9      select 102,4 from dual union all
 10      select 301,5 from dual union all
 11      select 101,1 from dual)
 12  ,tc as(
 13      select 101 wlbh,3 cksl from dual union all
 14      select 102,1 from dual union all
 15      select 201,5 from dual union all
 16      select 101,2 from dual)
 17  select ta.wlbh,
 18         nvl(sum(ta.cssl),0) cssl,
 19         nvl(sum(b.rksl),0) rksl,
 20         nvl(sum(c.cksl),0) cksl
 21  from ta,
 22       (select wlbh,sum(rksl) rksl
 23        from tb
 24        group by wlbh) b,
 25       (select wlbh,sum(cksl) cksl
 26        from tc
 27        group by wlbh) c
 28  where ta.wlbh=b.wlbh(+)
 29    and ta.wlbh=c.wlbh(+)
 30  group by ta.wlbh
 31  /
 
      WLBH       CSSL       RKSL       CKSL
---------- ---------- ---------- ----------
       101          4          3          5
       102          0          4          1
       201          0          0          5
       301          5          5          0
       501          6          0          0

#4


谢谢BOBO12082119!
你中间提出的那个问题,是因为,库存是初始化的。
一开始库存里面没有,后来就买进了,买进以后没有进行入库就直接出库了。

#5


可惜,不是我想要的。ta表里面的编码不会全的。

#6


SELECT *
  FROM (SELECT wlbh, nvl(cssl, 0) cssl, nvl(rksl, 0) rksl, nvl(cksl, 0) cksl
          FROM (SELECT wlbh, SUM(cssl) cssl FROM tableA GROUP BY wlbh)
          FULL OUTER JOIN (SELECT wlbh, SUM(rksl) rksl
                            FROM tableB
                           GROUP BY wlbh)
         USING (wlbh)
          FULL OUTER JOIN (SELECT wlbh, SUM(cksl) cksl
                            FROM tableC
                           GROUP BY wlbh)
         USING (wlbh))
 ORDER BY wlbh;

#7


我是新手,不太懂,还望解释语句的意思

#8


引用 7 楼 shinesai 的回复:
我是新手,不太懂,还望解释语句的意思

慢慢学习

#9


tangren(老兵新手) 正解。
谢谢!
将需要做外连接的先自己做成表。 

#1


SELECT * FROM tableA,tableB,tableC 
     WHERE A.WLBH = B.WLBH
      AND B.WLBH = C.WLBH

#2


楼主给的数据有问题,
比如:仓库里面没有201,为何入库表里面有201号货物?而且而且201号货物,都没有rksl=0怎么得来的cksl=5?

#3



SQL> with ta as(
  2       select 101 wlbh,4 cssl from dual union all
  3       select 301,5 from dual union all
  4       select 501,6 from dual union all
  5       select 102,0 from dual union all--这两项是我加上的,总觉得不是你的意思
  6       select 201,0 from dual)--说实话,你的表设计的太不合理了,这么大的数据冗余你尽然没发现?
  7  ,tb as(
  8      select 101 wlbh,2 rksl from dual union all
  9      select 102,4 from dual union all
 10      select 301,5 from dual union all
 11      select 101,1 from dual)
 12  ,tc as(
 13      select 101 wlbh,3 cksl from dual union all
 14      select 102,1 from dual union all
 15      select 201,5 from dual union all
 16      select 101,2 from dual)
 17  select ta.wlbh,
 18         nvl(sum(ta.cssl),0) cssl,
 19         nvl(sum(b.rksl),0) rksl,
 20         nvl(sum(c.cksl),0) cksl
 21  from ta,
 22       (select wlbh,sum(rksl) rksl
 23        from tb
 24        group by wlbh) b,
 25       (select wlbh,sum(cksl) cksl
 26        from tc
 27        group by wlbh) c
 28  where ta.wlbh=b.wlbh(+)
 29    and ta.wlbh=c.wlbh(+)
 30  group by ta.wlbh
 31  /
 
      WLBH       CSSL       RKSL       CKSL
---------- ---------- ---------- ----------
       101          4          3          5
       102          0          4          1
       201          0          0          5
       301          5          5          0
       501          6          0          0

#4


谢谢BOBO12082119!
你中间提出的那个问题,是因为,库存是初始化的。
一开始库存里面没有,后来就买进了,买进以后没有进行入库就直接出库了。

#5


可惜,不是我想要的。ta表里面的编码不会全的。

#6


SELECT *
  FROM (SELECT wlbh, nvl(cssl, 0) cssl, nvl(rksl, 0) rksl, nvl(cksl, 0) cksl
          FROM (SELECT wlbh, SUM(cssl) cssl FROM tableA GROUP BY wlbh)
          FULL OUTER JOIN (SELECT wlbh, SUM(rksl) rksl
                            FROM tableB
                           GROUP BY wlbh)
         USING (wlbh)
          FULL OUTER JOIN (SELECT wlbh, SUM(cksl) cksl
                            FROM tableC
                           GROUP BY wlbh)
         USING (wlbh))
 ORDER BY wlbh;

#7


我是新手,不太懂,还望解释语句的意思

#8


引用 7 楼 shinesai 的回复:
我是新手,不太懂,还望解释语句的意思

慢慢学习

#9


tangren(老兵新手) 正解。
谢谢!
将需要做外连接的先自己做成表。