我的表格如下:
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
我想在两个表中的SECTION
where 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)
当where
中的**Query 1**
条件移至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)
解释为什么Query 1
没有产生所需的结果以及为什么Query 3
加入class=2
,即使on
子句说AND A.class=1 AND B.class=1
是var os = require('os');
非常感谢。
答案 0 :(得分:0)
您首先查询是100%完美,只需将您的WHERE语句更改为OR而不是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而另一个表没有条件时,这会转储结果。使用" OR"你是说"在任何一个条件为真的加入之后取结果"。
答案 1 :(得分:0)
小心,条件是vs条件不同:
where
是使用连接选择行后应用的过滤器。情况并非总是如此join
... on条件在语义上等同于where条件。您可以查看更多详细信息here。
您的查询1< =>
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