簡體   English   中英

全部合並后僅返回一條記錄

[英]Only one record returned after union all

使用到AS / 400(iSeries)DB2數據庫的SQL接口,但遇到並發出問題, 可以在兩個表中存儲托盤信息,一個表用於未分配的庫存(warpall) ,一個用於分配的庫存(warpalq) 我需要在適用的情況下從兩個表中返回記錄。

warpalq只有極少數的關系字段以warpall一個我從需要的字段的warpall也被用來加入另一個表中,在沒有相對場warpalq

我正在使用並union從一個結果集中的兩個表中返回數據,然后將其他表聯接在一起。

問題是,在結果集上連接第三個表(warcmdt)時,它在commpmfdsccd字段中的commpm空值/ 0,因為在相應表中沒有該值的數據。

有什么方法可以將commpmfdsccd拉回到第2行的結果集中嗎? 交叉鏈接為pal#pm = pal#pq因此存在相對鏈接。

運行下面的SQL將返回此結果集。

不良結果

select 
clntwf, commpm, fdsccd, clsqwf, pal#wf, dtcdpm, clsswf, srb#pm, descsc, 
cor#or  

from
(select substr(warpall.clntpm,1,2) as clntwf, pal#pm as pal#wf, commpm, 
substr(warpall.clsspm,1,2) as clsswf, warpall.clsqpm * 1 as clsqwf, srb#pm, 
dtcdpm, srd#pm 
from warpall

where 
locnpm <> 'ASSEMBLED PALLET'
and commpm <> 'ASSEMBLED PALLET'
and clsqpm <> 0
and clntPM <> 'D2'
and pal#pm = '1005609592'

union all

select substr(clntpq,1,2) as clntwf, pal#Pq as pal#wf, '0', 
substr(clsspq,1,2) as clsswf, clsqpq * 1 as clsqwf, '0', '0', '0' 
from warpalq

where 
clsqpq <> 0
and clntPQ <> 'D2'
and pal#pq = '1005609592'

) as t9

left outer join warcmdt as t3
on 
t3.clntcd = t9.clntwf  and t3.commcd = t9.commpm

left join
warclss as t4
on
t4.clsssc = t9.clsswf

left join
warohrh as t5
on
t5.clntor = t9.clntwf 
and t5.srn#or = t9.srd#pm

order by pal#wf asc

您可以嘗試使用通用表表達式(CTE),如下所示:

with 
  pal (clntwf, pal#wf, commpm, clsswf, clsqwf, 
       srb#pm, dtcdpm, srd#pm) as (
    select
      substr(warpall.clntpm,1,2) as clntwf, 
      warpall.pal#pm as pal#wf, 
      warpall.commpm, 
      substr(warpall.clsspm,1,2) as clsswf, 
      warpall.clsqpm * 1 as clsqwf, 
      warpall.srb#pm, 
      warpall.dtcdpm, 
      warpall.srd#pm 
    from warpall
    where 
      warpall.locnpm <> 'ASSEMBLED PALLET'
      and warpall.commpm <> 'ASSEMBLED PALLET'
      and warpall.clsqpm <> 0
      and warpall.clntPM <> 'D2'
      and warpall.pal#pm = '1005609592'),

   alc (clntwf, pal#wf, commpm, clsswf, clsqwf, 
        srb#pm, dtcdpm, srd#pm) as (
     select 
       substr(warpalq.clntpq,1,2) as clntwf, 
       warpalq.pal#Pq as pal#wf, 
       pal.commpm, 
       substr(warpalq.clsspq,1,2) as clsswf, 
       warpalq.clsqpq * 1 as clsqwf, 
       '0', 
       '0', 
       pal.srd#pm 
     from warpalq
       join pal
         on waarpalq.pal#pq = pal.pal#wf
     where 
       warpalq.clsqpq <> 0
       and warpalq.clntPQ <> 'D2'
       and warpalq.pal#pq = '1005609592')

select 
  clntwf, commpm, fdsccd, clsqwf, pal#wf, dtcdpm, clsswf, srb#pm, descsc, cor#or  
from
  (select *
     from pal
   union all
   select *
     from alc
  ) as t9
  left outer join warcmdt as t3
    on t3.clntcd = t9.clntwf 
      and t3.commcd = t9.commpm
  left join warclss as t4
    on t4.clsssc = t9.clsswf
  left join warohrh as t5
    on t5.clntor = t9.clntwf 
      and t5.srn#or = t9.srd#pm
order by pal#wf asc

這使您可以在多個位置重用pal CTE,而無需重新定義它。 這意味着您可以將其加入到alc CTE中以獲取commpm ,稍后將其用於與warcmdt一起加入t9 現在,您不應該獲取該null。 我還帶了srd#pmalc CTE從warpall因為在之間的連接使用t9warohrh 如果不正確,則可以在alc CTE pal.srd#pm替換為'0'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM