如何获取Table B中关联状态全为true的Table A记录
筛选Table A中关联Table B所有status均为true的记录
需求说明
需要查询Table A中满足以下条件的记录:该A记录关联的所有Table B记录的status字段值均为true,同时返回对应的Table B记录。
示例数据
Table A
| id | name |
|---|---|
| 9 | 'name1' |
| 7 | 'name2' |
| 6 | 'name3' |
Table B
| id | idA | status |
|---|---|---|
| 20 | 9 | true |
| 21 | 9 | false |
| 22 | 7 | true |
| 23 | 7 | true |
| 24 | 7 | true |
| 30 | 6 | false |
| 31 | 6 | true |
| 32 | 6 | false |
预期输出
| A.id | A.name | B.id | B.idA | B.status |
|---|---|---|---|---|
| 7 | 'name2' | 22 | 7 | true |
| 7 | 'name2' | 23 | 7 | true |
| 7 | 'name2' | 24 | 7 | true |
解决方案
方法1:使用NOT EXISTS排除存在false的A记录
这是最直观的写法,先找出所有不存在关联B记录status为false的A记录,再关联B表获取对应数据:
SELECT a.*, b.* FROM TableA a JOIN TableB b ON a.id = b.idA WHERE NOT EXISTS ( SELECT 1 FROM TableB b2 WHERE b2.idA = a.id AND b2.status = false );
方法2:使用GROUP BY + HAVING筛选符合条件的A id
先通过分组统计每个A id对应的B记录中status为false的数量,筛选出数量为0的A id,再关联两张表:
SELECT a.*, b.* FROM TableA a JOIN TableB b ON a.id = b.idA JOIN ( SELECT idA FROM TableB GROUP BY idA HAVING COUNT(CASE WHEN status = false THEN 1 END) = 0 ) valid_a ON a.id = valid_a.idA;
方法3:使用LEFT JOIN + IS NULL排除无效A记录
通过左连接关联存在false的B记录,筛选出没有匹配到的A记录,再关联B表:
SELECT a.*, b.* FROM TableA a JOIN TableB b ON a.id = b.idA LEFT JOIN TableB b2 ON a.id = b2.idA AND b2.status = false WHERE b2.id IS NULL;
说明
NOT EXISTS通常在有合适索引(比如TableB的idA和status联合索引)时性能最优GROUP BY方法适合需要额外统计信息的场景LEFT JOIN写法更易于理解,适合新手
内容的提问来源于stack exchange,提问作者jrJerry
相关产品推荐
相关产品推荐

