我有一个非常简单的查询,但我不能像我想要的那样让它工作。
我有2张表,A
和B
非常相似,看起来像这样:
A
:
+------+----------+---------+
| a_id | a_cnt_id | a_value |
+------+----------+---------+
| 1 | 848 | 0.5 |
| 2 | 848 | 3 |
| 3 | 848 | 4 |
| 4 | 848 | 65 |
+------+----------+---------+
B
:
+------+----------+---------+
| b_id | b_cnt_id | b_value |
+------+----------+---------+
| 1 | 849 | 36 |
| 2 | 849 | 42 |
| 3 | 849 | 8 |
+------+----------+---------+
对于给定的一组B
, A
的记录多于{a_cnt_id, b_cnt_id}
。
我希望我的查询返回:
+------+------+---------+---------+
| a_id | b_id | a_value | b_value |
+------+------+---------+---------+
| 1 | 1 | 0.5 | 36 |
| 2 | 2 | 3 | 42 |
| 3 | 3 | 4 | 8 |
| 4 | NULL | 65 | NULL |
+----+--------+---------+---------+
我的(不工作)查询,因为它只返回前3行:
select distinct a.a_id, b.b_id, a.a_value, b.b_value
from b
full join a on b.b_id = a.a_id
where a.a_cnt_id = 849
and b.b_cnt_id = 848;
答案 0 :(得分:1)
我不记得我在哪里找到了这个但是你走了:
编辑: 图像的链接属于Visual-Representation-of-SQL-Joins。谢谢@jyparask
答案 1 :(得分:1)
将cnt_id
项检查移至ON
子句,以保留OUTER JOIN,如下所示:
select distinct a.a_id, b.b_id, a.a_value, b.b_value
from b
full join a on b.b_id = a.a_id
and a.a_cnt_id = 849
and b.b_cnt_id = 848;
答案 2 :(得分:1)
添加WHERE
子句会将结果过滤到where暗示的位置。因此,如果您有where a.a_cnt_id = 849
,则只会获得这些行,而不会使用null
。将过滤器移动到联接:
select distinct a.a_id, b.b_id, a.a_value, b.b_value
from b
full join a on b.b_id = a.a_id
and a.a_cnt_id = 849
and b.b_cnt_id = 848;