编写SQL查询:基于指定C_id获取A表符合条件的记录
问题描述
有三张表A、B、C,表结构如下:
表A:A_id, name 表B:B_id, A_id, C_id 表C:C_id, a1, a2
已知目标C_id,需从A表中获取满足以下任一条件的所有记录:
- A_id等于目标C_id对应C表中的a1值
- A_id等于目标C_id对应C表中的a2值
- A_id通过表B与目标C_id关联匹配
示例数据
表A
| A_id | Name |
|---|---|
| 1 | jon |
| 2 | Alice |
| 3 | Bob |
| 4 | Clara |
表B
| B_id | A_id | C_id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 4 | 1 |
| 3 | 2 | 2 |
| 4 | 4 | 2 |
表C
| C_id | a1 | a2 |
|---|---|---|
| 1 | 1 | 3 |
当指定C_id=1时,应返回A_id为1、3、4的记录。
解决方案
可以通过两种方式实现需求,以下是具体SQL写法:
方式一:用UNION合并多条件结果
SELECT a.* FROM A a JOIN C c ON a.A_id = c.a1 OR a.A_id = c.a2 WHERE c.C_id = 1 UNION SELECT a.* FROM A a JOIN B b ON a.A_id = b.A_id WHERE b.C_id = 1;
方式二:用IN子句整合符合条件的A_id
SELECT * FROM A WHERE A_id IN ( SELECT a1 FROM C WHERE C_id = 1 UNION SELECT a2 FROM C WHERE C_id = 1 UNION SELECT A_id FROM B WHERE C_id = 1 );
两种写法都会自动去重,确保不会返回重复的A表记录,都能得到符合要求的结果。
内容的提问来源于stack exchange,提问作者Rahul Sahastrabuddhe
相关产品推荐
相关产品推荐

