【发布时间】:2018-02-22 14:57:56
【问题描述】:
使用 SQL 接口进入 AS/400 (iSeries) DB2 数据库,但遇到并发出托盘信息可以存储在两个表中的位置,一个用于未分配库存(warpall),另一个用于分配股票(warpalq)。
如果适用,我需要从两个表中返回记录。
warpalq 只有少数几个与warpall 相关的字段
我需要来自warpall 的字段之一也用于加入另一个表,warpalq 中没有相关字段。
我使用union 在一个结果集中从两个表返回数据,然后加入其他表。
问题是,当在结果集上加入第三个表 (warcmdt) 时,它在 commpm 和 fdsccd 字段中有空值 / 0,因为它在相应的表中没有相应的数据。
有没有办法可以将commpm 和fdsccd 拉回第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
【问题讨论】:
-
嗯,查询与您的第一个示例完全不同,并且具有不同的 where 子句和连接,因此如果没有样本数据,任何人都可能无法进行此评估。
-
对不起,我只是简化了它- 重写一致性不好
-
无需道歉。很可能是连接标准或 warpalq 表中的 where 子句存在问题。如果您放置您期望的记录样本,那么有人应该很容易发现问题。
-
只是小费。在 union all 查询中,我添加了一个常量,这样我就可以知道行来自哪里 select 'mytablea' as t , a, b。 c from mytablea union all select 'mytableb' as t , a, b, c from tytableb
-
...
commpm明确是'0'的常量warpalq(作为 null 的替代?),它被用作warcmdt的连接条件的一部分.你确定那里有匹配的记录吗?正如 Jacob 所说,很可能由于加入标准,需要示例/所需的结果数据。