基于tableAB表t列值从tableA、tableB查询记录的SQL实现求助
针对分支查询需求的SQL解决方案
我来帮你搞定这个分支查询的需求!先明确下三张表的结构和数据(方便理解关联逻辑):
-- tableAB表 CREATE TABLE tableAB (id INT, tid INT, t INT); INSERT INTO tableAB VALUES (1,1,1), (2,1,2); -- tableA表 CREATE TABLE tableA (id INT, name VARCHAR(10)); INSERT INTO tableA VALUES (1,'mark'); -- tableB表 CREATE TABLE tableB (id INT, Aid INT, age INT); INSERT INTO tableB VALUES (1,1,22);
你的核心需求是根据tableAB.t的值做分支查询:
- 当
t=1时,获取tableA的name列 - 当
t=2时,获取tableB的age列,同时通过tableB.Aid关联tableA拿到对应的name
方法一:使用UNION ALL合并分支结果
这种方式逻辑清晰,把两种场景拆成两个独立查询再合并,保证结果集结构统一:
-- 处理t=1的场景:关联tableA取name SELECT ab.id AS ab_id, a.name, NULL AS age -- 该场景不需要age,用NULL占位保证列数一致 FROM tableAB ab JOIN tableA a ON ab.tid = a.id -- tableAB.tid对应tableA.id WHERE ab.t = 1 UNION ALL -- 处理t=2的场景:关联tableB和tableA取age和name SELECT ab.id AS ab_id, a.name, b.age FROM tableAB ab JOIN tableB b ON ab.tid = b.id -- tableAB.tid对应tableB.id JOIN tableA a ON b.Aid = a.id -- tableB.Aid关联tableA.id WHERE ab.t = 2;
执行后得到的结果:
| ab_id | name | age |
|---|---|---|
| 1 | mark | NULL |
| 2 | mark | 22 |
方法二:使用左连接+CASE表达式实现单查询分支
如果希望用一次查询完成逻辑,可以通过左连接关联所有可能的表,再用CASE表达式筛选对应场景的字段值:
SELECT ab.id AS ab_id, -- 根据t的值选择对应的name来源 CASE WHEN ab.t = 1 THEN a1.name WHEN ab.t = 2 THEN a2.name END AS name, -- 只有t=2时取tableB的age,否则为NULL CASE WHEN ab.t = 2 THEN b.age END AS age FROM tableAB ab -- t=1时关联tableA LEFT JOIN tableA a1 ON ab.t = 1 AND ab.tid = a1.id -- t=2时关联tableB LEFT JOIN tableB b ON ab.t = 2 AND ab.tid = b.id -- t=2时通过tableB关联tableA LEFT JOIN tableA a2 ON ab.t = 2 AND b.Aid = a2.id;
这个查询的结果和方法一完全一致,好处是只执行一次查询,适合数据量较大且需要避免多次扫描表的场景。
内容的提问来源于stack exchange,提问作者Toleo
相关产品推荐
相关产品推荐

