如何通过SQL根据匹配列名替换关联表中的列值?
解决SQL多语言翻译字段合并问题
你的原SQL语句存在两个核心问题:
- LEFT JOIN 后,TABLE_A的一行数据会匹配RESOURCES中的多行记录,导致结果出现重复行;
- 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
逻辑说明
- 子查询部分:
- 按
CONTEXT_ID(对应TABLE_A的ID)和LANG_ID分组,确保每个ID的每种语言只会生成一行数据; - 用
MAX(CASE...)条件聚合,分别提取对应KEY的翻译值,没有翻译的字段会返回NULL。
- 按
- 主查询部分:
- 使用
COALESCE函数优先取翻译值,若没有匹配的翻译则使用TABLE_A中的原始值; - LEFT JOIN保证TABLE_A中没有翻译记录的行(比如ID=3)也会被保留,LANG_ID显示为NULL。
- 使用
这个语句执行后会完全匹配你给出的预期结果。
内容的提问来源于stack exchange,提问作者Mehmet Ince
相关产品推荐
相关产品推荐

