如何使用Oracle SQL将两张数据表合并为指定结构?
Oracle SQL实现数据表合并方案
针对你的需求,我们可以通过两种实用方式实现表合并,以下是具体方案:
方法一:条件聚合(适配同规格下多变体场景)
假设第一张表名为ITEM_SPEC,第二张表名为ITEM_STOCK,通过分组+条件聚合可将同规格下不同ITEM的库存拆分到对应列:
SELECT -- 提取ITEM前缀(去除末尾Z)作为最终展示的ITEM CASE WHEN s.ITEM LIKE '%Z' THEN SUBSTR(s.ITEM, 1, LENGTH(s.ITEM)-1) ELSE s.ITEM END AS ITEM, s.SPEC, -- 不带Z的ITEM库存映射为STOCK1 MAX(CASE WHEN s.ITEM NOT LIKE '%Z' THEN st.STOCK END) AS STOCK1, -- 带Z的ITEM库存映射为STOCK2 MAX(CASE WHEN s.ITEM LIKE '%Z' THEN st.STOCK END) AS STOCK2 FROM ITEM_SPEC s INNER JOIN ITEM_STOCK st ON s.ITEM = st.ITEM -- 按最终ITEM和规格分组,聚合对应库存值 GROUP BY CASE WHEN s.ITEM LIKE '%Z' THEN SUBSTR(s.ITEM, 1, LENGTH(s.ITEM)-1) ELSE s.ITEM END, s.SPEC;
方法二:自连接(适配固定主ITEM+Z后缀ITEM的场景)
如果数据规则固定为主ITEM(如A、B)对应带Z后缀的ITEM(如AZ、BZ),可通过表自连接精准匹配:
SELECT main.ITEM, main.SPEC, main_stock.STOCK AS STOCK1, z_stock.STOCK AS STOCK2 FROM ITEM_SPEC main -- 关联主ITEM的库存数据 INNER JOIN ITEM_STOCK main_stock ON main.ITEM = main_stock.ITEM -- 关联同规格下带Z后缀的ITEM记录 INNER JOIN ITEM_SPEC z_item ON main.SPEC = z_item.SPEC AND z_item.ITEM = main.ITEM || 'Z' -- 关联带Z后缀ITEM的库存数据 INNER JOIN ITEM_STOCK z_stock ON z_item.ITEM = z_stock.ITEM -- 仅保留不带Z的主ITEM记录 WHERE main.ITEM NOT LIKE '%Z';
执行结果验证
两种方法执行后均可得到目标结构的数据:
| ITEM | SPEC | STOCK1 | STOCK2 |
|---|---|---|---|
| A | A1-1 | 1 | 3 |
| B | B1-1 | 2 | 4 |
内容的提问来源于stack exchange,提问作者Tri Ha Minh
相关产品推荐
相关产品推荐

