Oracle SQL Full Outer Joins

时间:2017-11-17 20:31:37

标签: 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      

我想在两个表中的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=1var os = require('os');非常感谢。

2 个答案:

答案 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