解决:Oracle数据库中Left join on 后面为null时匹配不上

简介: 解决:Oracle数据库中Left join on 后面为null时匹配不上

1:记录

最近在公司开发遇到一个小需求,在级联查询时, 当ON.... AND .... 时,ON后面的条件为NULL ,AND 后面的条件不为NULL。要求返回A表与B表匹配上的数据。

2:遇到问题

 当ON 后面的条件为NULL,AND 后的条件不为NULL。

例:

ON NULL = NULL AND 6 = 6

   使用级联查询时,只返回主表中的数据,次表中的数据却没有匹配上显示都是NULL(可是明明都有数据)

3:解决过程

3.1 临时表A

SQL:

SELECT 
            PROD_TYPE,
            CAST(COUNT(WORK_ORDER_ID) AS float) AS 计划数量,
            SUBSTR(START_DATE, 1, 7)            AS START_DATE,
            MAX(TO_CHAR(DATA_TIME, 'YYYY-MM'))  AS 统计日期,
            MAX(STAT_TIME)                      AS 创建时间
     FROM DWS_WORK_ORDER_INFO
     GROUP BY SUBSTR(START_DATE, 1, 7), PROD_TYPE

f914c6172da248c7aaf70be022aff99d.png

3.2  临时表B

SQL:

 SELECT CAST(COUNT(WORK_ORDER_ID) AS float) AS 完成数量,
           SUBSTR(START_DATE,1,7)      AS START_DATE,
           PROD_TYPE
    FROM BRAIN.DWS_WORK_ORDER_INFO
    WHERE IF_COMP = '是'
    GROUP BY SUBSTR(START_DATE,1,7), PROD_TYPE

0537ca910a004c6e9b364665bffbafad.png此时我想通过LEFT JOIN 左关联查出  PROD_TYPE = NULL  时的计划数量和完成数量关联条件为:

ON a.PROD_TYPE = b.PROD_TYPE
AND a.START_DATE = b.START_DATE

3.3 错误SQL(不符合需求)

select
    a.计划数量,
    a.PROD_TYPE,
    b.PROD_TYPE,
    a.START_DATE,
    b.START_DATE,
    b.完成数量
from(SELECT 
            PROD_TYPE,
            CAST(COUNT(WORK_ORDER_ID) AS float) AS 计划数量,
            SUBSTR(START_DATE, 1, 7)            AS START_DATE,
            MAX(TO_CHAR(DATA_TIME, 'YYYY-MM'))  AS 统计日期,
            MAX(STAT_TIME)                      AS 创建时间
     FROM DWS_WORK_ORDER_INFO
     GROUP BY SUBSTR(START_DATE, 1, 7), PROD_TYPE) a
         LEFT JOIN (
    --已完成
    SELECT CAST(COUNT(WORK_ORDER_ID) AS float) AS 完成数量,
           SUBSTR(START_DATE,1,7)      AS START_DATE,
           PROD_TYPE
    FROM DWS_WORK_ORDER_INFO
    WHERE IF_COMP = '是'
    GROUP BY SUBSTR(START_DATE,1,7), PROD_TYPE ) b
             ON  a.PROD_TYPE = b.PROD_TYPE
            AND a.START_DATE = b.START_DATE

执行后的结果:

很明显2023-10月的 PROD_TYPE为null 时 临时表B的数据没有匹配上,后来查询资料发现,联表查询时,null≠null

72b0e0db6dd4408d80bd14cd35ded942.png

4:解决方法

这里可以使用 NVL() ,IFNULL(), 函数均可以
COALESCE(a.PROD_TYPE,-1) = COALESCE(b.PROD_TYPE,-1)
select
    a.计划数量,
    a.PROD_TYPE,
    b.PROD_TYPE,
    a.START_DATE,
    b.START_DATE,
    b.完成数量
from(SELECT 
            PROD_TYPE,
            CAST(COUNT(WORK_ORDER_ID) AS float) AS 计划数量,
            SUBSTR(START_DATE, 1, 7)            AS START_DATE,
            MAX(TO_CHAR(DATA_TIME, 'YYYY-MM'))  AS 统计日期,
            MAX(STAT_TIME)                      AS 创建时间
     FROM DWS_WORK_ORDER_INFO
     GROUP BY SUBSTR(START_DATE, 1, 7), PROD_TYPE) a
         LEFT JOIN (
    --已完成
    SELECT CAST(COUNT(WORK_ORDER_ID) AS float) AS 完成数量,
           SUBSTR(START_DATE,1,7)      AS START_DATE,
           PROD_TYPE
    FROM DWS_WORK_ORDER_INFO
    WHERE IF_COMP = '是'
    GROUP BY SUBSTR(START_DATE,1,7), PROD_TYPE ) b
             -- 这里可以使用 NVL() ,IFNULL() 函数均可以
             ON  COALESCE(a.PROD_TYPE,-1) = COALESCE(b.PROD_TYPE,-1)
            AND a.START_DATE = b.START_DATE

执行结果:

9593ad967d7f4549869ef6a2b80271cb.png

目录
相关文章
|
8月前
|
SQL Oracle 关系型数据库
避坑,Oracle中left join 与 (+) 的区别
避坑,Oracle中left join 与 (+) 的区别
|
存储 关系型数据库 MySQL
MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?
一篇短文让你明白MySQL数据库的表中 NULL 和 空值之间的区别!
4975 0
MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?
|
8月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之使用 Event Time Temporal Join 关联多个 HBase 后,Kafka 数据的某个字段变为 null 是什么原因导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
168 0
|
8月前
|
SQL 消息中间件 Kafka
实时计算 Flink版操作报错合集之使用 Event Time Temporal Join 关联多个 HBase 后,Kafka 数据的某个字段变为 null 是什么原因导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
111 0
|
8月前
|
SQL Oracle 关系型数据库
Oracle查询优化-left join、right join、inner join、full join和逗号的区别
【1月更文挑战第5天】【1月更文挑战第13篇】实际查询时,多表联查是常规操作,但是连接方式有多种。
727 0
|
Oracle 关系型数据库
ORACLE中null的排序问题
ORACLE中null的排序问题
135 0
|
8月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
8月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
193 2
|
5月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 IS NULL
【8月更文挑战第12天】
702 0
在 MySQL 中使用 IS NULL
|
5月前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
160 0

推荐镜像

更多