DB2 9.7.01多表查询问题:CASE WHEN子查询未返回预期结果
解决DB2 9.7.01中按type返回对应产品的查询问题
我先根据你的描述推断下大致的表结构(如果和实际有出入,你可以调整字段名):
- 表A:包含
id(记录ID)、type('K'或'P')、target_id(关联产品/套件的ID,P类型关联表B的产品ID,K类型关联表C的套件ID) - 表C(套件表):有
kit_id(套件ID)和product_id(关联表B的产品ID,一个套件对应多条产品记录) - 表B(产品表):存储产品详情,比如
product_id、product_name等字段
你的核心需求是遍历表A的每条记录,type为'P'时返回单个产品,type为'K'时返回套件下的所有产品,之前的查询没得到预期结果,大概率是关联逻辑没拆分清楚,下面给你两种可行的解决方案:
方案一:用UNION ALL拆分两种场景(推荐,逻辑清晰性能好)
把两种类型的查询分开写,再合并结果,这是最直观的方式:
-- 处理type='P'的情况:直接关联表B拿单个产品 SELECT a.id AS source_record_id, a.type, b.product_id, b.product_name -- 替换成你实际需要的产品字段 FROM 表A a INNER JOIN 表B b ON a.target_id = b.product_id WHERE a.type = 'P' UNION ALL -- 处理type='K'的情况:先关联表C拿套件下的所有产品ID,再关联表B拿产品详情 SELECT a.id AS source_record_id, a.type, b.product_id, b.product_name FROM 表A a INNER JOIN 表C c ON a.target_id = c.kit_id INNER JOIN 表B b ON c.product_id = b.product_id WHERE a.type = 'K' ORDER BY source_record_id;
为什么这个方案能解决问题?
- 两种类型的关联逻辑完全分开,不会互相干扰
- 用
UNION ALL而不是UNION,因为两种场景的结果不会重复,UNION ALL的性能比UNION好很多(不需要去重) - 结果里会保留表A的原始记录ID,方便你对应到源数据
方案二:用LEFT JOIN保留表A所有记录(适合需要空结果的场景)
如果你的需求是即使表A的记录没有对应产品/套件(比如target_id无效)也要保留,可以用LEFT JOIN配合条件判断:
SELECT a.id AS source_record_id, a.type, -- 优先取P类型的产品,没有的话取K类型的 COALESCE(b_p.product_id, b_k.product_id) AS product_id, COALESCE(b_p.product_name, b_k.product_name) AS product_name FROM 表A a -- 仅当type='P'时关联表B LEFT JOIN 表B b_p ON a.type = 'P' AND a.target_id = b_p.product_id -- 仅当type='K'时关联表C LEFT JOIN 表C c ON a.type = 'K' AND a.target_id = c.kit_id -- 通过表C关联表B拿套件下的产品 LEFT JOIN 表B b_k ON c.product_id = b_k.product_id -- 可选:过滤掉没有对应产品的记录,如果不需要保留空结果就加这个条件 WHERE b_p.product_id IS NOT NULL OR b_k.product_id IS NOT NULL ORDER BY source_record_id;
注意事项
- 一定要确保表A的
target_id在不同type下的关联对象是对的:P类型对应表B的产品ID,K类型对应表C的套件ID,这是关联的核心 - 如果你的表字段名和我推断的不一样,比如表C的套件ID不是
kit_id,直接替换成实际字段名就行 - DB2 9.7.01完全支持这两种写法,兼容性没问题
如果你的当前查询有具体的错误或者表结构和我推断的不同,可以把代码贴出来,我再帮你细化调整~
内容的提问来源于stack exchange,提问作者a55embler
相关产品推荐
相关产品推荐

