SQL语句以选择上一行状态为'C'的行AS400

在这个

正在针对IBMI Series 7在sql上运行

我有一张桌子,上面存储着有关订单的信息。每行都有一个订单号(ON),零件号(PN)和序列号(SEQ)。每个ON将具有链接到它们的多个PN,并且每个部件号具有多个SEQ Number。每个序列号代表在零件上执行工作的顺序。一旦零件在某个位置并准备好进行处理,则在系统中的其他位置会显示一个标志。我想做的是获取某个位置的订单清单,该位置尚未到达,但在上一个位置已被关闭(这意味着零件在路上)。

我在下面列出了一个我认为应该可以使用的查询,但是出现以下错误:“列限定符或表t未定义”。我的问题在哪里?

Select * From (SELECT M2ON as Order__Number , M2SEQ as Sequence__Number,
M2PN as Product__Number,ML2OQ as Order__Quantity                    
FROM M2P 
WHERE M2pN in (select R1PN FROM R1P WHERE (RTWC = '7411') AND (R1SEQ = M2SEQ)
)                            
AND M2ON IN (SELECT M1ON FROM M1P WHERE ML1RCF = '')                                         
ORDER BY ML2OSM ASC) as T 
WHERE 
T.Order__Number in  (Select t3.m2on from (SELECT *
FROM(Select * from m2p
where m2on = t.Order__Number and m2pn = t.Product__Number
order by m2seq asc fetch first 2 rows only
)as t1 order by m2seq asc fetch first row only
) as t3 where t3.m2stat = 'C')

编辑-有此问题其他人的答案Clutton's Answer稍作修改即可工作,因此感谢您的快速答复!我必须命名外部表并在子查询中指定该表,否则as400会反冲并告诉我找不到列。我还必须按顺序号降序排列,以便获取低于该参数的最高记录(否则,例如,如果我的序列号为20,即使有10个可用,也可以获取5个,应该首先显示。我现在使用的子查询,请注意实际的查询名称m2p为T1。

IFNULL((
    SELECT
        M2STAT
    FROM
        M2P as M2P_1
    WHERE
        M2ON = T1.M2ON
        AND M2SEQ < T1.M2SEQ
    AND M2PN IN (select R1PN FROM R1P WHERE (RTWC = @WC) AND (R1SEQ = T1.M2SEQ))
    ORDER BY M2SEQ DESC
    FETCH FIRST ROW ONLY
), 'NULL') as PRIOR_M2STAT            
克卢顿

只要阅读您的问题,就好像我经常模仿RPG READPE操作码一样。是M2P订单/序列的钥匙吗?如果是这样,那么这是一个基本的部分,可以帮助您扩展其余的查询。

我假设您正在尝试使用SQL通过键获取先前的记录。在RPG中,这就像使用Order / Seq键对文件的键进行READPE。

这是一个使用子查询获取先前记录的状态字段的示例。

SELECT 
    M2ON, M2PN, M2OQ, M2STAT,
    IFNULL((
        SELECT
            M2STAT
        FROM
            M2P as M2P_1
        WHERE
            M2P_1.M2ON = M2ON
            AND M2P_1.M2SEQ < M2SEQ
        FETCH FIRST ROW ONLY
    ), '') as PRIOR_M2STAT
FROM
    M2P

请注意,这IFNULL会将子查询包装在中,以处理它是第一个序列号且不存在先前序列的情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章