【问题标题】:Oracle JOIN that include NULLS?包含 NULLS 的 Oracle JOIN?
【发布时间】:2022-01-28 06:32:05
【问题描述】:

我有以下简单的 SELECT 语句:

SELECT COUNT (*)
    FROM EPS_PROPOSAL prop
    WHERE prop.REQUESTED_START_DATE_INITIAL >= DATE '2018-10-01';
 -- 2183

现在,我想加入我的 EPS_PROPOSAL 表中的另外 2 个表。 BUDGET_DOCUMENTBUDGET

3张表的关系是这样的:

EPS_PROPOSAL.DOCUMENT_NUMBER ===> BUDGET_DOCUMENT.PARENT_DOCUMENT_KEY

BUDGET_DOCUMENT.DOCUMENT_NUMBER ===> BUDGET.DOCUMENT_NUMBER

鉴于这种关系,我不理解以下结果:

   SELECT COUNT (*) 
       FROM EPS_PROPOSAL prop
       JOIN BUDGET_DOCUMENT doc on prop.DOCUMENT_NUMBER = doc.PARENT_DOCUMENT_KEY
       JOIN BUDGET bud on doc.DOCUMENT_NUMBER = bud.DOCUMENT_NUMBER
       WHERE prop.REQUESTED_START_DATE_INITIAL >= DATE '2018-10-01' AND bud.FINAL_VERSION_FLAG = 'Y'; 
   -- 1585

查看后面的SELECT 语句的实际记录,我注意到它忽略了所有BUDGET.TOTAL_COSTNULLBUDGET.FINAL_VERSION_FLAGNULL 的记录。

SELECT prop.NPS_PROPOSAL_NUMBER, bud.TOTAL_COST FROM EPS_PROPOSAL prop
    JOIN BUDGET_DOCUMENT doc on prop.DOCUMENT_NUMBER = doc.PARENT_DOCUMENT_KEY
    JOIN BUDGET bud on doc.DOCUMENT_NUMBER = bud.DOCUMENT_NUMBER
    WHERE prop.REQUESTED_START_DATE_INITIAL >= DATE '2018-10-01' AND bud.FINAL_VERSION_FLAG = 'Y'
    ORDER BY TO_NUMBER(prop.NPS_PROPOSAL_NUMBER); -- 1585

问题:如何包含与这 3 个表相交的所有记录,包括 BUDGET 表的记录 WHERE TOTAL_COSTFINAL_VERSION_FLAG 也是 NULL 但仍满足我的 >= DATE 过滤器?

【问题讨论】:

  • 好吧,花点时间用名为ABC 的表重建您的问题,其中包含的不是数千行,而是6 行。比发布带有DDL 和数据的完整 示例。 很好的机会是您将在本练习中获得解决方案。提示 - 检查 joinouter join 之间的区别。

标签: oracle join


【解决方案1】:

我建议你

  • 从初始查询开始(只包含一张表并返回 2183 行的查询)
  • 然后只加入一个表 (budget_document) 并检查返回的行数
  • 加入另一个表(budget);检查行数
  • 最后,添加final_version_flag条件

因为 - 在我看来 - total_cost 似乎是这里的受害者。并不是它的NULL 值导致不返回行,而是连接不返回这些行。

选择缺少的任何一个并再次重新运行所有内容,这次是通过过滤 document_number 上的行(或其 pair 其他表中的行)和在向查询中添加新元素时,看看发生了什么。

或者/另外,看看 外部联接 是否有任何好处(因为现在您正在使用内部联接,这意味着只有“匹配”的行才会作为结果返回)。

我们无法为您执行此操作,我们没有您的数据。

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2010-11-30
    • 1970-01-01
    • 2019-08-22
    • 2021-11-14
    相关资源
    最近更新 更多