如何编写包含两个INNER JOIN与CASE条件判断的SQL查询语句
构建符合需求的SQL查询
没问题,我来帮你实现包含关联和条件判断的SQL语句,先明确你的场景细节,再给出解决方案:
表结构与示例数据
假设三个表分别命名为TableA(主数据)、TableB(类型映射表)、TableC(结果映射表),它们的示例数据如下:
TableA
| ID | Typ | Case |
|---|---|---|
| 123 | AAA | zzz |
| 124 | BBB | yyy |
| 125 | CCC | yyy |
TableB
| Typ1 | ID1 |
|---|---|
| AAA | 888 |
| BBB | 999 |
| CCC | 777 |
TableC
| ID2 | Result |
|---|---|
| 666 | 1 |
| 555 | 2 |
| 777 | 3 |
查询需求逻辑
你需要的核心逻辑是:
- 返回
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;
逻辑细节说明
- 为什么用LEFT JOIN而非INNER JOIN**:
你的需求是返回TableA的所有行(包括Case不为yyy的123、124),如果用INNER JOIN会过滤掉这些不满足关联条件的行,所以用LEFT JOIN来保留主表的所有数据。同时在JOIN条件里加上a.Case = 'yyy',只有当需要关联时才会去匹配TableB和TableC,提升查询效率。 - COALESCE的作用:
处理Case = 'yyy'但关联不到TableC的情况(比如TableB的ID1在TableC中不存在),此时会显示No match而不是NULL。 - CASE分支的覆盖:
完全覆盖了你需求中的两种情况:Case为yyy时走关联逻辑,否则直接返回固定文本。
预期执行结果
运行上述SQL后,会得到你想要的结果:
| ID | Typ | Result |
|---|---|---|
| 123 | AAA | No match |
| 124 | BBB | No match |
| 125 | CCC | 3 |
内容的提问来源于stack exchange,提问作者InFlames82
相关产品推荐
相关产品推荐

