SQL查询问题:如何实现fnd.PK1_VALUE优先匹配两个字段的逻辑
SQL调整方案
原SQL存在的问题
- 语法错误:最后一行关联条件中NVL函数内多了冗余的
=符号,语法校验无法通过 - 逻辑不匹配需求:NVL仅能处理单个字段值为空的场景,无法实现「优先按A规则关联匹配,无匹配行时再按B规则关联」的需求
- 隐式表连接写法可读性差,容易出现关联逻辑错误
调整后可运行SQL
SELECT rcv.shipment_line_id, COALESCE(fnt_priority.TITLE, fnt_second.TITLE, '0') AS Putaway FROM RCV_TRANSACTIONS rcv INNER JOIN RCV_SHIPMENT_HEADERS rcvh ON rcvh.SHIPMENT_HEADER_ID = rcv.SHIPMENT_HEADER_ID -- 第一优先级:按header_interface_id关联附件 LEFT JOIN FND_ATTACHED_DOCUMENTS fnd_priority ON TO_CHAR(fnd_priority.PK1_VALUE) = TO_CHAR(rcvh.HEADER_INTERFACE_ID) LEFT JOIN FND_DOCUMENTS_TL fnt_priority ON fnd_priority.DOCUMENT_ID = fnt_priority.DOCUMENT_ID AND fnt_priority.LANGUAGE = 'US' -- 第二优先级:第一优先级无匹配时,按interface_transaction_id关联附件 LEFT JOIN FND_ATTACHED_DOCUMENTS fnd_second ON TO_CHAR(fnd_second.PK1_VALUE) = TO_CHAR(rcv.INTERFACE_TRANSACTION_ID) LEFT JOIN FND_DOCUMENTS_TL fnt_second ON fnd_second.DOCUMENT_ID = fnt_second.DOCUMENT_ID AND fnt_second.LANGUAGE = 'US' WHERE rcv.transaction_type = 'DELIVER' -- 若业务要求必须匹配到至少一个附件,可开启下面的过滤条件 -- AND (fnt_priority.TITLE IS NOT NULL OR fnt_second.TITLE IS NOT NULL)
逻辑说明
- 用两次独立的LEFT JOIN分别实现两种优先级的匹配规则,避免关联条件冲突
COALESCE函数按优先级返回第一个非空结果:优先返回头维度匹配到的附件标题,无匹配时返回行维度匹配到的附件标题,两者都无匹配时返回默认值0- 所有关联规则都写在JOIN的ON子句中,不会误过滤掉未匹配的有效行
内容的提问来源于stack exchange,提问作者WooW Egypt
相关产品推荐
相关产品推荐

