You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access数据库中如何将同表关联的套装组件分列展示?

Access数据库:将套装产品组件拆分为独立字段查询

现有表结构

TbProduct表(产品主表)

productId  |  descriptionProduct
   1       |     Cable         
   2       |     Mouse         
   3       |     Keyboard        
   4       |     Screen
   5       |     Set1       
   6       |     Set2        
   7       |     Set3  

TbCompose表(套装组件关联表)

productIdComposed  |  productIdComposing
   5               |     1         
   5               |     2         
   6               |     1       
   6               |     4
   7               |     3       
   7               |     4        

TbCompose的两个字段均为外键,与TbProduct的productId字段建立一对多关联:productIdComposed对应套装ID,productIdComposing对应套装包含的组件ID。需求是将每套固定2个组件的套装,把组件拆分为ProductComp1、ProductComp2两个字段,输出如下格式:

descriptionProduct |  ProductComp1   | ProductComp2
   Set1            |     Cable       |     Mouse
   Set2            |     Cable       |     Screen
   Set3            |     Keyboard    |     Screen

补充说明:每套固定包含2个组件,套装需保留在TbProduct表中,不能拆分到其他表。

实现查询语句

方法1:基于排名的行转列

通过子查询给每个套装的组件分配序号,再利用聚合函数实现列转行:

SELECT
    p.descriptionProduct,
    MAX(IIF(c.rank = 1, pc.descriptionProduct, NULL)) AS ProductComp1,
    MAX(IIF(c.rank = 2, pc.descriptionProduct, NULL)) AS ProductComp2
FROM
    TbProduct p
INNER JOIN (
    SELECT
        productIdComposed,
        productIdComposing,
        (SELECT COUNT(*) 
         FROM TbCompose c2 
         WHERE c2.productIdComposed = c1.productIdComposed 
           AND c2.productIdComposing <= c1.productIdComposing) AS rank
    FROM TbCompose c1
) c ON p.productId = c.productIdComposed
INNER JOIN TbProduct pc ON c.productIdComposing = pc.productId
WHERE
    p.descriptionProduct LIKE 'Set%'
GROUP BY
    p.descriptionProduct
ORDER BY
    p.descriptionProduct;

方法2:自连接实现配对

利用套装固定2个组件的特性,通过自连接关联两个组件,同时避免重复组合:

SELECT
    p.descriptionProduct,
    pc1.descriptionProduct AS ProductComp1,
    pc2.descriptionProduct AS ProductComp2
FROM
    TbProduct p
INNER JOIN TbCompose c1 ON p.productId = c1.productIdComposed
INNER JOIN TbProduct pc1 ON c1.productIdComposing = pc1.productId
INNER JOIN TbCompose c2 ON p.productId = c2.productIdComposed
INNER JOIN TbProduct pc2 ON c2.productIdComposing = pc2.productId
WHERE
    p.descriptionProduct LIKE 'Set%'
    AND c1.productIdComposing < c2.productIdComposing
GROUP BY
    p.descriptionProduct, pc1.descriptionProduct, pc2.descriptionProduct;

两个方法均可输出目标格式,可根据实际数据情况选择使用。

内容的提问来源于stack exchange,提问作者Sorbet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:10:30