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

如何通过单查询从DynamoDB两张关联表获取嵌套结构数据?

可行,以下是不同场景下的实现方式

1. 原生SQL实现(按数据库类型区分)

PostgreSQL

使用json_agg()函数聚合关联数据为JSON数组:

SELECT
    e."#Emp-PK" AS "PK",
    e."#Emp-SK" AS "SK",
    e."Name" AS "name",
    json_agg(
        json_build_object(
            'PK', ep."#Emp-PRO-PK",
            'SK', ep."#Emp-PRO-SK",
            'project-title', ep."project-title"
        )
    ) AS "projects"
FROM "Employee" e
LEFT JOIN "Employee-projects" ep 
    ON e."#Emp-PK" = ep."EmpPKKey" 
    AND e."#Emp-SK" = ep."EmpSKKey"
GROUP BY e."#Emp-PK", e."#Emp-SK", e."Name";

MySQL

通过JSON_ARRAYAGG()和JSON_OBJECT()组合生成嵌套结构:

SELECT
    e.`#Emp-PK` AS `PK`,
    e.`#Emp-SK` AS `SK`,
    e.`Name` AS `name`,
    JSON_ARRAYAGG(
        JSON_OBJECT(
            'PK', ep.`#Emp-PRO-PK`,
            'SK', ep.`#Emp-PRO-SK`,
            'project-title', ep.`project-title`
        )
    ) AS `projects`
FROM `Employee` e
LEFT JOIN `Employee-projects` ep 
    ON e.`#Emp-PK` = ep.`EmpPKKey` 
    AND e.`#Emp-SK` = ep.`EmpSKKey`
GROUP BY e.`#Emp-PK`, e.`#Emp-SK`, e.`Name`;

SQL Server

用STRING_AGG()拼接JSON字符串再转为数组:

SELECT
    e.[#Emp-PK] AS [PK],
    e.[#Emp-SK] AS [SK],
    e.[Name] AS [name],
    JSON_QUERY('[' + STRING_AGG(
        JSON_QUERY(
            CONCAT(
                '{"PK":"', ep.[#Emp-PRO-PK], '",',
                '"SK":"', ep.[#Emp-PRO-SK], '",',
                '"project-title":"', ep.[project-title], '"}'
            )
        ), ','
    ) + ']') AS [projects]
FROM [Employee] e
LEFT JOIN [Employee-projects] ep 
    ON e.[#Emp-PK] = ep.[EmpPKKey] 
    AND e.[#Emp-SK] = ep.[EmpSKKey]
GROUP BY e.[#Emp-PK], e.[#Emp-SK], e.[Name];

2. ORM框架实现(以MyBatis为例)

无需手动拼接复杂SQL,通过结果映射直接生成嵌套对象:

<resultMap id="EmployeeResultMap" type="Employee">
    <id property="PK" column="#Emp-PK"/>
    <result property="SK" column="#Emp-SK"/>
    <result property="name" column="Name"/>
    <collection property="projects" ofType="EmployeeProject">
        <id property="PK" column="#Emp-PRO-PK"/>
        <result property="SK" column="#Emp-PRO-SK"/>
        <result property="projectTitle" column="project-title"/>
    </collection>
</resultMap>

<select id="getEmployeesWithProjects" resultMap="EmployeeResultMap">
    SELECT 
        e.#Emp-PK, e.#Emp-SK, e.Name,
        ep.#Emp-PRO-PK, ep.#Emp-PRO-SK, ep.project-title
    FROM Employee e
    LEFT JOIN Employee-projects ep 
        ON e.#Emp-PK = ep.EmpPKKey 
        AND e.#Emp-SK = ep.EmpSKKey
</select>

执行该查询后,框架会自动将同一员工的项目数据封装到projects集合中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:17:53