mariadb 连接Maria DB中的两个表以生成新列

vbopmzt1  于 2023-03-18  发布在  其他
关注(0)|答案(2)|浏览(158)

我需要以一种特定的方式连接MariaDB中的两个表。对于表A中的每个项目,我需要为目标1添加一列,为目标2添加一列。目标1和目标2的值是与表B中最高阶段的目标相关联的字段is_core的值,如示例所示。
在我的真实的问题中会有更多的目标,但为了简单起见,我在这里只使用了2个。
有没有人能帮上忙?我对DB不是很有经验,我的头在燃烧。
表A
| 身份证|姓名|
| - ------|- ------|
| 1个|项目A|
| 第二章|项目B|
| 三个|项目C|
表B
| 身份证|项目标识|物镜|是核心|相|
| - ------|- ------|- ------|- ------|- ------|
| 1个|1个|目标1|无|无|
| 第二章|1个|目标1|无|1个|
| 三个|1个|目标1|1个|第二章|
| 四个|1个|目标2|无|无|
| 五个|1个|目标2|无|1个|
| 六个|1个|目标2|无|第二章|
| 七|第二章|目标1|1个|无|
| 八个|第二章|目标2|无|无|
| 九|三个|目标1|无|无|
| 十个|三个|目标2|无|无|
TableA.id 链接到表B。项目Id
预期结果:
| 项目标识|姓名|目标1|目标2|
| - ------|- ------|- ------|- ------|
| 1个|项目A|1个|无|
| 第二章|项目B|1个|无|
| 三个|项目B|无|无|
非常感谢!

sg24os4d

sg24os4d1#

以下是使用条件聚集的一种方法:

SELECT
    tableA.*,
    MAX(objective = 'objective1' AND is_core) AS objective1,
    MAX(objective = 'objective2' AND is_core) AS objective2
FROM tableA
JOIN tableB USING (project_id)
GROUP BY project_id;

我们必须稍微猜测一下,因为并不是100%清楚project Aobjective1的三行如何Map到objective1列中的值。
此查询检查is_core以查找最新阶段:

SELECT project_id, name,
    MAX(objective = 'objective1' AND is_core) AS objective1,
    MAX(objective = 'objective2' AND is_core) AS objective2
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY project_id, objective ORDER BY phase DESC) rn
    FROM tableA
    JOIN tableB USING (project_id)
) t
WHERE rn = 1
GROUP BY project_id;
krugob8w

krugob8w2#

SELECT *,
       EXISTS ( SELECT NULL
                FROM tableB 
                WHERE tableB.project_id = tableA.project_id
                   AND tableB.objective = 'objective1' ) objective1,
       EXISTS ( SELECT NULL
                FROM tableB 
                WHERE tableB.project_id = tableA.project_id
                   AND tableB.objective = 'objective2' ) objective2
FROM tableA;

如果目标的数量(以及最终列的数量)是不确定的(即您在PIVOT中需要),则使用动态SQL。

相关问题