Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL完全外部联接_Oracle_Join_Full Outer Join - Fatal编程技术网

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