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

如何编写包含两个INNER JOIN与CASE条件判断的SQL查询语句

构建符合需求的SQL查询

没问题,我来帮你实现包含关联和条件判断的SQL语句,先明确你的场景细节,再给出解决方案:

表结构与示例数据

假设三个表分别命名为TableA(主数据)、TableB(类型映射表)、TableC(结果映射表),它们的示例数据如下:

TableA

IDTypCase
123AAAzzz
124BBByyy
125CCCyyy

TableB

Typ1ID1
AAA888
BBB999
CCC777

TableC

ID2Result
6661
5552
7773

查询需求逻辑

你需要的核心逻辑是:

  • 返回TableA的所有行;
  • 仅当TableA.Case = 'yyy'时,通过Typ关联TableB,再用关联得到的ID关联TableC获取Result;
  • 若Case不为yyy,或者关联后没有匹配到Result,则显示No match。

实现SQL语句

SELECT
    a.ID,
    a.Typ,
    CASE
        -- 当Case为yyy时,优先取关联到的Result,否则显示No match
        WHEN a.Case = 'yyy' THEN COALESCE(c.Result, 'No match')
        -- Case不为yyy时直接返回No match
        ELSE 'No match'
    END AS Result
FROM
    TableA a
-- 仅当Case为yyy时才关联TableB,避免无效关联
LEFT JOIN TableB b 
    ON a.Typ = b.Typ1 
    AND a.Case = 'yyy'
-- 用TableB的ID1关联TableC的ID2
LEFT JOIN TableC c 
    ON b.ID1 = c.ID2
-- 按ID排序保证结果顺序和预期一致
ORDER BY
    a.ID;

逻辑细节说明

  1. 为什么用LEFT JOIN而非INNER JOIN**:
    你的需求是返回TableA的所有行(包括Case不为yyy的123、124),如果用INNER JOIN会过滤掉这些不满足关联条件的行,所以用LEFT JOIN来保留主表的所有数据。同时在JOIN条件里加上a.Case = 'yyy',只有当需要关联时才会去匹配TableB和TableC,提升查询效率。
  2. COALESCE的作用:
    处理Case = 'yyy'但关联不到TableC的情况(比如TableB的ID1在TableC中不存在),此时会显示No match而不是NULL。
  3. CASE分支的覆盖:
    完全覆盖了你需求中的两种情况:Case为yyy时走关联逻辑,否则直接返回固定文本。

预期执行结果

运行上述SQL后,会得到你想要的结果:

IDTypResult
123AAANo match
124BBBNo match
125CCC3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:02:32