Oracle中LEFT JOIN后AND与WHERE的异同

这篇具有很好参考价值的文章主要介绍了Oracle中LEFT JOIN后AND与WHERE的异同。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、AND 过滤之后再连接

2、WHERE 连接之后再过滤

下面以具体例子来说明:

(1)、建表及插入测试数据
--建测试表
create table FACT_TAB
( ID     INTEGER,
  STATUS VARCHAR2(8)
);
create table DIM_STATUS
( STSTUS_CLASS VARCHAR2(8),
  STATUS_CODE  VARCHAR2(8),
  STATUS_DESC  VARCHAR2(8)
);
--插入测试数据
insert into FACT_TAB (ID, STATUS)values (1, '1');
insert into FACT_TAB (ID, STATUS)values (2, '1');
insert into FACT_TAB (ID, STATUS)values (3, '2');
insert into FACT_TAB (ID, STATUS)values (4, '1');
insert into FACT_TAB (ID, STATUS)values (5, '2');
insert into FACT_TAB (ID, STATUS)values (6, '3');
insert into FACT_TAB (ID, STATUS)values (7, '1');
insert into FACT_TAB (ID, STATUS)values (8, '2');
insert into FACT_TAB (ID, STATUS)values (9, '3');
insert into FACT_TAB (ID, STATUS)values (10, '3');
insert into FACT_TAB (ID, STATUS)values (11, '2');
insert into FACT_TAB (ID, STATUS)values (12, '1');

insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('1', '1', '正常');
insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('1', '2', '注销');
insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('2', '1', '正常');
insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('2', '2', '注销');
insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('2', '3', '遗失');
insert into DIM_STATUS (STSTUS_CLASS, STATUS_CODE, STATUS_DESC)values ('2', '4', '未知');

commit;
(2)、on后面and 条件表示先过滤之后,再连接

以下两种写法,所得的结果相同:

SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC
  FROM FACT_TAB A
  LEFT JOIN DIM_STATUS B
    ON A.STATUS = B.STATUS_CODE
   AND B.STSTUS_CLASS = '2'
   AND B.STATUS_CODE = '1'
 ORDER BY A.ID;

SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC
  FROM FACT_TAB A
  LEFT JOIN (SELECT * FROM DIM_STATUS WHERE STATUS_CODE = '1') B
    ON A.STATUS = B.STATUS_CODE
   AND B.STSTUS_CLASS = '2'
--AND B.STATUS_CODE = '1'
 ORDER BY A.ID;

Oracle中LEFT JOIN后AND与WHERE的异同,CSDN/nsj820迁移,Oracle,oracle,数据库,Left Join,where与AND的使用

(3)、on后面where条件表示先关联之后,再过滤
SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC
  FROM FACT_TAB A
  LEFT JOIN DIM_STATUS B
    ON A.STATUS = B.STATUS_CODE
   AND B.STSTUS_CLASS = '2'
 WHERE B.STATUS_CODE = '1'
 ORDER BY A.ID;

 Oracle中LEFT JOIN后AND与WHERE的异同,CSDN/nsj820迁移,Oracle,oracle,数据库,Left Join,where与AND的使用

(4)、全值的情况
--全值的情况
SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC
  FROM FACT_TAB A
  LEFT JOIN DIM_STATUS B
    ON A.STATUS = B.STATUS_CODE
   AND B.STSTUS_CLASS = '2'
 ORDER BY A.ID;

Oracle中LEFT JOIN后AND与WHERE的异同,CSDN/nsj820迁移,Oracle,oracle,数据库,Left Join,where与AND的使用 

(5)、说明:

用到此类连接的情况,多为事实表为主表,维表为次表的代码关联的连接;JOIN后AND与WHERE的区别,其实就是主次表过滤与联接的先后问题,这一点能认识到,所有得出的结果,都不难理解了;另外,如果主表或次表的联接关键字,有多个重复记录,则联接的结果会催生出多条重复记录,这就要求联接的关键字根据需要须是事实上的主键。文章来源地址https://www.toymoban.com/news/detail-690076.html

附:上面讨论的是对辅表限制的情况,下面的是对事实表限制用on和where的情况

1、对事实表(主表)用on
将在结果集中过滤不满足主表条件的辅表信息,但因为是左连接主表的所有记录都会显示出来。
SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC
  FROM FACT_TAB A
  LEFT JOIN DIM_STATUS B
    ON A.STATUS = B.STATUS_CODE
   AND B.STSTUS_CLASS = '2'
      --AND B.STATUS_CODE = '1'
   AND A.ID IN ('1', '2', '3')
 ORDER BY A.ID;
2、对事实表(主表)用where
如果对主表的限制放在where里,则不满足主表条件的所有主表辅表信息记录将都不会体现在结果集中。
SELECT A.ID, NVL(B.STATUS_CODE, '-1') STATUS_CODE, B.STATUS_DESC
  FROM FACT_TAB A
  LEFT JOIN DIM_STATUS B
    ON A.STATUS = B.STATUS_CODE
   AND B.STSTUS_CLASS = '2'
--AND B.STATUS_CODE = '1'
 WHERE A.ID IN ('1', '2', '3')
 ORDER BY A.ID;
注:因为对主表用ON限制没什么意义,所以基本上用不到。

到了这里,关于Oracle中LEFT JOIN后AND与WHERE的异同的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【环境配置】使用Docker搭建LAMP环境

    这篇文章不是介绍DOCKER是什么,也不是阐述DOCKER的核心:镜像/容器和仓库之间的关系,它只是一篇让刚刚接触DOCKER的初学者,在没有完全了解DOCKER是什么之前,也能尽快的在Linux系统下面通过DOCKER来搭建一个LAMP环境,这是其一;其二才是我写这篇文章的初心,我觉得很多事情在

    2024年02月15日
    浏览(31)
  • win10设置各种闪退解决办法

    修改注册表,通过regedit打开注册表,找到\\\"HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesAppXSvc\\\"右边的“start”的值,修改为2 重启 管理员运行PowerShell,执行如下命令: (注意符号) $manifest = (Get-AppxPackage Microsoft.WindowsStore).InstallLocation + \\\'AppxManifest.xml\\\' ; Add-AppxPackage -DisableDevelopme

    2024年02月11日
    浏览(38)
  • python读取excel数据并用双y轴绘制柱状图和折线图,柱子用渐变颜色填充

    往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 python随机生成数据并用双y轴绘制两条带误差

    2024年02月10日
    浏览(36)
  • 27《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享

    ​《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限,如果错误欢迎批评指正。 第六章:The principles of protein folding kinetics (蛋白质折叠动力学的原理) 整个二级结构通常作为一个单元进行折叠 蛋白质倾向于以基序或二级结构的单位折叠,而不是以

    2023年04月24日
    浏览(50)
  • 计算机网络——运输层(1)暨小程送书

    我的计算机网络专栏,是自己在计算机网络学习过程中的学习笔记与心得,在参考相关教材,网络搜素的前提下,结合自己过去一段时间笔记整理,而推出的该专栏,整体架构是根据计算机网络 自顶向下 方法而整理的,包括各大高校教学都是以此顺序进行的。 面向群体:在

    2024年01月18日
    浏览(28)
  • 监控室值班人员脱岗睡岗识别算法 yolov7

    监控室值班人员脱岗睡岗识别算法基于Yolov7深度学习神经网络算法,监控室值班人员脱岗睡岗识别算法模型可以7*24小时不间断自动人员是否在工位上(脱岗睡岗玩手机),若人员没有在工位,系统则立即抓拍告警,算法鲁棒性强。YOLOv7 的发展方向与当前主流的实时目标检测

    2024年02月05日
    浏览(77)
  • Boyer-Moore 投票算法

    这里先贴题目: 通俗点来讲,就是占领据点,像攻城那样,对消。 当你的据点有人时对消,无人时就占领。  这道题使用该算法可实现时间复杂度为O(n),空间复杂度为O(1),接下来看代码:  我们定义一个amzing先记录数组第一个数字,并且数量为0,然后遍历整个数组,当cou

    2024年02月13日
    浏览(23)
  • CentOS详细安装教程

    本文在虚拟机上安装 CentOS Linux release 7.6.1810 版本的操作系统,仅作为安装记录。 1、进入 CentOS 官网:https://www.centos.org/download/ 2、鼠标向下拉,点击 alternative downloads 3、鼠标向下拉,找到想要安装的版本,点击 Tree 4、进入到 isos/ 目录 5、进入到 x86_64/ 6、选择对应的镜像文件

    2024年02月03日
    浏览(26)
  • kali linux查看局域网下所有IP,并对指定IP攻击

    kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击 首先我们打开我们熟悉的kali linux操作系统,利用指令: 来确认本机的ip地址 确认了本机的ip地址之后,利用一下的指令查看局域网下所有ip: 如下图所示: 因为自己的小米手机也连接到了同一个wifi下面,所以正好发现

    2024年02月12日
    浏览(27)
  • python+大数据校园卡数据分析 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于yolov5的深度学习车牌识别系统实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分 工作量:4分 创新点:3分 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/d

    2024年02月06日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包