Oracle SQL完全外部联接
我的表格如下:Oracle SQL完全外部联接,oracle,join,full-outer-join,Oracle,Join,Full Outer Join,我的表格如下: SELECT * FROM r_a; CLASS SECTION ----- ------- 1 A 1 B 2 A 2 B SELECT * FROM r_b; CLASS SECTION ----- ------- 1 B 1 C 2 B 2 C 我想通过两个表
SELECT * FROM r_a;
CLASS SECTION
----- -------
1 A
1 B
2 A
2 B
SELECT * FROM r_b;
CLASS SECTION
----- -------
1 B
1 C
2 B
2 C
我想通过两个表中CLASS=1的列部分对这些表执行完全外部联接。我期望的输出是:
SECTION SECTION_1
------- ---------
B B
A (Null)
(Null) C
但是,以下查询只生成匹配行,类似于内部联接的结果
**QUERY 1**
SELECT a.section, b.section
FROM
r_a a
FULL OUTER JOIN
r_b b
ON a.section=b.section
WHERE A.class=1 AND B.class=1
SECTION SECTION_1
------- ---------
B B
通过在嵌套查询中获取where条件,我能够获得所需的结果:
**QUERY 2**
SELECT a.section, b.section
FROM
(SELECT SECTION FROM r_a WHERE class=1) a
FULL OUTER JOIN
(SELECT SECTION FROM r_b WHERE class=1) b
ON a.section=b.section
SECTION SECTION_1
------- ---------
B B
(Null) C
A (Null)
当**查询1**
中的where
条件移动到on
子句时,结果更令人惊讶:
** Query 3**
SELECT a.section, b.section
FROM
r_a a
FULL OUTER JOIN
r_b b
ON a.section=b.section AND A.class=1 AND B.class=1
SECTION SECTION_1
------- ---------
B B
(Null) C
(Null) B
(Null) C
B (Null)
A (Null)
A (Null)
MORE CLARITY:
*************
SELECT *
FROM
r_a a
FULL OUTER JOIN
r_b b
ON a.section=b.section AND A.class=1 AND B.class=1
CLASS SECTION CLASS_1 SECTION_1
------ ------- ------- ---------
1 B 1 B
(Null) (Null) 1 C
(Null) (Null) 2 B
(Null) (Null) 2 C
2 B (Null) (Null)
2 A (Null) (Null)
1 A (Null) (Null)
非常感谢解释为什么query1
不能产生所需的结果,以及为什么query3
在class=2
上连接,即使on
子句说,并且A.class=1和B.class=1
。您的第一个查询是100%完美的,只需将WHERE语句改为或代替and即可
SELECT a.section, b.section
FROM
r_a a
FULL OUTER JOIN
r_b b
ON a.section=b.section
WHERE A.class=1 OR B.class=1
当您第二次尝试子查询时,基本上就是这样做的
请记住,WHERE子句是在FROM子句之后执行的。当您使用AND时,这里的意思是“仅在两个条件均为真的联接后获取结果”。显然,当一个表的条件为1而另一个表的条件为1时,这会转储结果。使用“或”,您的意思是“在任何一个条件为真的联接之后获取结果” 小心,条件与条件不同:
其中
是使用联接选择行后应用的筛选器。连接
并不总是这样。。。on条件在语义上等价于where条件。你可以看到更多细节
你的问题1
按您所说的操作将返回额外的行,其中A.class=1,B.class=2表示section=B,A.class=2,B.class=1表示section=B。请自己模拟并查看。问题中的输出列与其代码或您的代码不一致。这不是这些查询的输出,因为列名与代码不一致。请在代码问题中给出一个——剪切、粘贴、可运行的代码、所需的输出、清晰的规范和解释。您似乎希望在r_b中使用不同的名称,或者在联接之前将子查询中的节重命名为节_1。了解完全联接返回的内容:行上的内部联接并集所有不匹配的左、右表行以null扩展。始终知道作为外部联接的一部分,您需要什么样的内部联接。上的WHERE或内部联接,在上的外部联接删除表中由NULL扩展的任何行后,要求右/左/双表列不为NULL,即在行上只保留左/右/内部[sic]联接,即“将外部联接转换为内部联接”。你有。
select asection, bsection from(
SELECT a.section asection, b.section bsection, a.CLASS a, b.CLASS b
FROM r_a a
FULL OUTER JOIN r_b b
ON a.section=b.section
)
WHERE a=1 AND b=1