请问关于oracle的两个代码,结果有何区别

这两个代码的运行逻辑是什么,出来的结果会一致吗
原代码:

select a.id,
sum(case when t.applydate between '20200101' and '20200331' then (t.city_amt+t.county_amt) end) Q1,
sum(case when t.applydate between '20200401' and '20200630' then (t.city_amt+t.county_amt) end) Q2,
sum(case when t.applydate between '20200701' and '20200930' then (t.city_amt+t.county_amt) end) Q3,
sum(case when t.applydate between '20201001' and '20201231' then (t.city_amt+t.county_amt) end) Q4
from test_0227 a left join mk_dzs t on a.id=t.primary_id
where t.applydate between '20200101' and '20201231'
and t.code like 'AA101%'
group by a.id

修正代码:

select a.id,
sum(case when t.applydate between '20200101' and '20200331' then (t.city_amt+t.county_amt) end) Q1,
sum(case when t.applydate between '20200401' and '20200630' then (t.city_amt+t.county_amt) end) Q2,
sum(case when t.applydate between '20200701' and '20200930' then (t.city_amt+t.county_amt) end) Q3,
sum(case when t.applydate between '20201001' and '20201231' then (t.city_amt+t.county_amt) end) Q4
from test_0227 a left join (select * from mk_dzs t1
where t1.applydate between '20200101' and '20201231'
and t1.budgetsubjectcode like 'AA101%')t
on a.id=t.primary_id
group by a.id

1、从SQL本身来说,两个SQL的结果是不一样的(在一定的数据特殊分布情况下,你会得到两个SQL执行结果一致的错误结论)
2、首先,两个SQL中的 mk_dzs 表中的条件不同:前一个是:t.code like 'AA101%',后一个是:t1.budgetsubjectcode like 'AA101%'
3、其次,LEFT JOIN 中,如果右表中的字段出现在 WHERE 条件上且无 NULL 判定,则,其效果跟 INNER JOIN 一致,即,第一个SQL其实是一个INNER JOIN,而不是LEFT JOIN
4、排除我第 2 点说的字段不同的情况外,将第一个 SQL 的 WHERE 条件放到 LEFT JOIN 的条件中,即可达到第二个SQL同样的效果:

from test_0227 a left join mk_dzs t on a.id=t.primary_id and t.applydate between '20200101' and '20201231' and t.code like 'AA101%'

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7645106
  • 这篇博客也不错, 你可以看下oracle数据库获取表的列名以及列名的注释,并按表中字段原来的顺序显示
  • 除此之外, 这篇博客: 【持续更新】 Oracle 的常见错误代码及处理方法中的 二、错误代码、产生原因及处理方案 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • ORA-00911:无效字符
            问题详情:在 PL/SQL 或者 SQL*PLUS 中可以正常执行的 SQL 语句,在程序中不能正常执行,报以上错误。
            解决方案:将 SQL 语句中的末尾分号去掉。
    • ORA-00917:缺失逗号
    • ORA-01017: 用户名/口令无效:登陆被拒绝
    • ORA-01031: 权限不足
      问题详情:在进行系统的操作的时候提示权限不足,请检查该用户是否有相应的权限。
    • ORA-01502: 索引或这类索引的分区处于不可用状态
      问题详情:在向表插入数据时,提示此信息。
      原因分析:1、该数据表被迁移过表空间;2、该索引被禁用过。
      解决方案:
      1、重建索引。alter index index_name rebuild online ;
      2、重新启用索引。alter index index_name unusable ;
    • ORA-01722: 无效数字
        问题详情:在进行使用TO_NUMBER()函数,将文本转换为数字的时候,提示此错误。原因是该文本中存在除了正负号、小数点、阿拉伯数字0-9之外的其他字符。可以使用正则表达式进行筛选。还有一种原因是该文本为全角字符,需要转换为半角字符才能使用此函数进行转换。
    • ORA-02449:表中的唯一/主键被外键引用
    • ORA-03113:通信通道的文件结尾
      可能原因:归档空间满了,清理一下即可。
    • ORA-12514:TNS: 监听程序当前无法识别连接描述符中请求的服务
        原因分析:
        A、数据库实例没有注册到监听,请1分钟后重试。
    • ORA-12560:TNS: 协议适配器错误
        原因分析:
        A、数据库实例没有启动。
        B、数据库监听没有启动。
        C、此错误常见于 Windows 平台,出现此错误的原因是系统当前默认的ORACLE_SID 不可用或不正确。
        处理方案:查看系统当前默认的Oracle_Sid 的方法是:使用快捷键Windows+R打开【运行】对话框,输入【regedit】按回车键,即可打开注册表,在地址栏输入:
    计算机\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1
    

      查看右侧名称为:ORACLE_SID的数据数值,是否为当前系统运行实例的SID,如果不是请修改,然后关闭注册表即可。
      D、数据库端口(默认为1521)为防火墙阻止连接,在防火墙中开放此端口即可。

    • ORA-19502: 文件 *, 块编号 * (块大小=4096) 上出现写入错误
    • ORA-27072: 文件 I/O 错误
    • ORA-31693: 表数据对象 * 无法加载/卸载并且被跳过
  • 您还可以看一下 天才小犀牛老师的Oracle数据库 大事务的数据更改对数据库内部的影响课程中的 课程简介小节, 巩固相关知识点