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

如何通过SQL根据匹配列名替换关联表中的列值?

解决SQL多语言翻译字段合并问题

你的原SQL语句存在两个核心问题:

  1. LEFT JOIN 后,TABLE_A的一行数据会匹配RESOURCES中的多行记录,导致结果出现重复行;
  2. CASE语句只能处理当前行的KEY值,无法将同一语言(LANG_ID)下的NAME和DESCRIPTION翻译值合并到同一行。

正确的SQL实现

通过条件聚合+分组先将RESOURCES表中的翻译值按CONTEXT_ID和LANG_ID整理成每行对应一个ID的多语言字段,再与TABLE_A左连接,即可得到预期结果:

SELECT
    TA.ID,
    COALESCE(RES.NAME_VALUE, TA.NAME) AS NAME,
    COALESCE(RES.DESCRIPTION_VALUE, TA.DESCRIPTION) AS DESCRIPTION,
    RES.LANG_ID
FROM TABLE_A TA
LEFT JOIN (
    -- 子查询:按ID和语言分组,提取对应字段的翻译值
    SELECT
        CONTEXT_ID,
        LANG_ID,
        MAX(CASE WHEN KEY = 'NAME' THEN VALUE END) AS NAME_VALUE,
        MAX(CASE WHEN KEY = 'DESCRIPTION' THEN VALUE END) AS DESCRIPTION_VALUE
    FROM RESOURCES
    WHERE CONTEXT = 'TABLE_A'
    GROUP BY CONTEXT_ID, LANG_ID
) RES ON TA.ID = RES.CONTEXT_ID

逻辑说明

  1. 子查询部分:
    • 按CONTEXT_ID(对应TABLE_A的ID)和LANG_ID分组,确保每个ID的每种语言只会生成一行数据;
    • 用MAX(CASE...)条件聚合,分别提取对应KEY的翻译值,没有翻译的字段会返回NULL。
  2. 主查询部分:
    • 使用COALESCE函数优先取翻译值,若没有匹配的翻译则使用TABLE_A中的原始值;
    • LEFT JOIN保证TABLE_A中没有翻译记录的行(比如ID=3)也会被保留,LANG_ID显示为NULL。

这个语句执行后会完全匹配你给出的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:39:37