联盟没有给出正确的答案

时间:2015-04-16 17:53:30

标签: oracle join oracle11g oracle10g oracle-sqldeveloper

1)select count(*) from LCL_RKM_AuditForm; **O/P : 868**

2)select count(*) from RKM_KnowledgeArticleManager; **O/P : 8511**

3)select count(*) from 
LCL_RKM_AuditForm A
**right** outer join 
RKM_KnowledgeArticleManager B
on A.ARTICLE_ID=B.DocID; **O/P : 9216**

4)select count(*) from 
LCL_RKM_AuditForm A
**left** outer join 
RKM_KnowledgeArticleManager B
on A.ARTICLE_ID=B.DocID; **O/P : 1973**

5)select count(*) from 
LCL_RKM_AuditForm A,RKM_KnowledgeArticleManager B
**where** A.ARTICLE_ID=B.DocID; **O/P : 1973**

我的理解是。,。

左外连接将显示A表中的所有值和B表中的公共值。

右外连接将显示B表中的所有值和A表中的常用值。

共同价值观是指什么?如果它的外连接意味着它只应该只提供 868 结果吗?如果正确外部联接,这意味着它应该仅提供 8511 结果吗?

第五个陈述我使用了 WHERE 条款,这意味着它只能给我 868 条目吗?

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

您的预期结果似乎是基于错误的假设,即两个表中的行之间存在一对一的映射。

对于标准内连接(与上一个查询中一样),将返回两个表中每个匹配的行组合。由于您获得的结果多于第一个表中的行,因此第一个表中的给定行可能在第二个表中具有多个匹配的行。

例如,如果表A中有一行,ArticleID = 1,表B中有两行,DocID = 1,那么这两个表的连接将产生2行。

当您更改为外部联接时,您将获得至少与内部联接相同的行数,并且可能更多。外连接将返回与相应内连接相同的行;另外,对于“内部”表中“外部”表中没有任何匹配项的任何行,它将返回该行,第二个表中的列为NULL值。

您的LEFT OUTER JOIN返回与内部联接相同的行数;这意味着表A中的每一行在表B中至少有一个匹配的行。

你的RIGHT OUTER JOIN会返回更多行。这意味着表B中有许多行在表A中没有匹配的行。