两个表之间的简单外连接不起作用

时间:2014-07-25 10:09:23

标签: sql oracle

我有一个非常简单的查询,但我不能像我想要的那样让它工作。

我有2张表,AB非常相似,看起来像这样:

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;

3 个答案:

答案 0 :(得分:1)

我不记得我在哪里找到了这个但是你走了: enter image description here

编辑: 图像的链接属于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;