PostgreSQL中满足B列非0条件的左连接SQL查询需求
问题描述
现有两张表(表A、表B),需查询id与B列,采用LEFT JOIN关联。需求如下:
- 仅当表B的
B列存在至少一个非0值时,返回完整LEFT JOIN结果; - 若使用INNER JOIN会丢失
B值为0的行,不符合需求。
测试案例
Case-1
表A
| id | A |
|---|---|
| 101 | a1 |
| 102 | a2 |
| 103 | a3 |
表B
| id | B |
|---|---|
| 101 | 2 |
| 102 | 0 |
| 103 | 0 |
期望结果:(101,2),(102,0),(103,0)
Case-2
表A
| id | A |
|---|---|
| 101 | a1 |
| 102 | a2 |
| 103 | a3 |
表B
| id | B |
|---|---|
| 101 | 0 |
| 102 | 0 |
| 103 | 0 |
期望结果:空集
PostgreSQL解决方案
可以通过EXISTS子查询判断表B是否存在非0值,再结合LEFT JOIN实现需求:
SELECT a.id, b.B FROM table_a a LEFT JOIN table_b b ON a.id = b.id WHERE EXISTS (SELECT 1 FROM table_b WHERE B != 0);
逻辑说明
EXISTS (SELECT 1 FROM table_b WHERE B != 0)会先检查表B中是否存在至少一个非0的B值;- 如果存在该值,LEFT JOIN后的所有行都会被保留(包括
B为0的行),匹配Case-1的需求; - 如果不存在该值,WHERE条件不成立,结果集直接为空,匹配Case-2的需求。
内容的提问来源于stack exchange,提问作者VEMIREDDY CHANDRA TEJ
相关产品推荐
相关产品推荐

