【问题标题】:Joins are not giving the right answers联接没有给出正确的答案
【发布时间】:2015-06-23 07:34:37
【问题描述】:

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表中的常用值。

共同价值观指的是什么?如果它是 left 外连接,这意味着它应该只给出 868 结果对吗?如果它的 right 外连接意味着它应该只给出 8511 结果对吗?

我使用了 WHERE 子句的第 5 个语句,这意味着它应该只给我 868 个条目,对吗?

请帮帮我。

【问题讨论】:

  • 您的 ID 字段在任一表中是否唯一?看起来您只是为某些值获得了多个匹配项。
  • 是的,它在任一表中都不是唯一的。我的要求是从具有 3 列的 A 表中获取所有行,并从具有 1 列的 B 表中获取相应的值

标签: oracle join oracle11g oracle10g oracle-sqldeveloper


【解决方案1】:

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

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

例如,如果表 A 中有一行 ArticleID = 1,表 B 中有两行 DocID = 1,则这两个表在这些字段上的连接将产生 2 行。

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

您的左外连接返回与内连接相同的行数;这意味着表 A 中的每一行在表 B 中至少有一个匹配行。

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

【讨论】:

  • 感谢戴夫的澄清。现在我通过使用如下两列的组合实现了我的要求 >>select count(*) from LCL_RKM_AuditForm A left outer join RKM_KnowledgeArticleManager B on A.ARTICLE_ID=B.DocID and A.ARTICLE_VERSION = B.ARTICLEVERSION;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多