Oracle中LEFT JOIN后AND与WHERE的异同

news2024/9/23 13:22:51

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;

(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;

 

(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;

 

(5)、说明:

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

附:上面讨论的是对辅表限制的情况,下面的是对事实表限制用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限制没什么意义,所以基本上用不到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/958865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware tools的安装以及按钮灰色的解决方法

VMware tools的安装 ** 注意:** 新版本的 VMware 会自动安装的 VMware tools,如何测试 VMware tools 呢?在Windows 系统里复制一段话,能粘贴到 Ubuntu 系统里终端里,说明 VMware tools 已经安装了。 没有安装的请参考…

聚观早报|阿维塔完成B轮融资;文心一言向全社会开放

【聚观365】9月1日消息 阿维塔完成B轮融资 文心一言向全社会开放 长安汽车上半年销量超121万辆 北京工人体育场5G超级网络启用 挚文集团Q2净利润5.684亿元 阿维塔完成B轮融资 日前,阿维塔科技宣布完成B轮融资,募集资金30亿元,投后估值近…

指针:程序员的望远镜

指针 1. 前言2. 指针概述2.1 内存与地址2.2 取地址2.3 指针是什么?2.4 解引用(间接访问)2.5 指针的大小 3. 指针类型的作用3.1 指针-整数3.2 指针的解引用 4. 野指针4.1 野指针成因4.2 如何规避野指针 5. 指针运算5.1 指针-整数5.2 指针-指针…

若依后台管理系统学习

前端系统是指运行在浏览器或者移动设备上的用户界面层,它负责与用户交互,展示数据,调用后端服务等。前端系统的架构设计需要考虑以下几个方面: 前端系统在整个系统中的位置和关系:你需要明确前端系统与后端服务&#…

GE IS200JPDDG1AAA输入模块

多通道输入: IS200JPDDG1AAA 可能具有多个输入通道,允许连接多个传感器或信号源。 信号类型: 这个模块通常支持不同类型的输入信号,包括模拟信号和数字信号。 高精度: 输入模块通常具有高精度的信号测量能力&#xf…

Dialog 的标题title属性用slot实现。(复制功能)

当你的标题内容需要一些除了文字以外的功能&#xff0c;比如复制按钮&#xff0c;那么就需要用slot传入。 文档中是这么写的&#xff1a; 举例&#xff1a; <span slot"title" class"whitelist-title"><span> {{ whitelistId }} </span&g…

亚马逊、速卖通如何批量养号?自养号测评对卖家有哪些好处?

测评养号就是自己用真实环境养出来的买家账号。通过国外的邮箱、手机号码和注册当地真实收货地址&#xff0c;包括当地的国外住宅专线IP、国外真实虚拟信用卡等等&#xff0c;不过很多卖家也没有完全认清自养号的好处。那么测评自养号对卖家有哪些好处&#xff1f; 1、不用担心…

【C++】set和map

set和map 1. 预备知识2. set2.1 set的概念2.2 set的常见接口 3. multiset4. map4.1 map的概念4.2 map的常见接口 5. multimap6. 练习 1. 预备知识 set和map是关联式容器&#xff0c;里面存储的不是元素本身&#xff0c;存储的是<key,value>结构的键值对&#xff0c;比ve…

Python入门教程 | Python3 字符串

字符串是 Python 中最常用的数据类型。我们可以使用引号( ’ 或 " )来创建字符串。 创建字符串很简单&#xff0c;只要为变量分配一个值即可。例如&#xff1a; var1 Hello World! var2 "Tarzan"Python 访问字符串中的值 Python 不支持单字符类型&#xff…

J. Med. Chem 2022|TocoDecoy+: 针对机器学习打分函数训练和测试的无隐藏偏差的数据集构建新方法

原文标题&#xff1a;TocoDecoy: A New Approach to Design Unbiased Datasets for Training and Benchmarking Machine-Learning Scoring Functions 论文链接&#xff1a;https://pubs.acs.org/doi/10.1021/acs.jmedchem.2c00460 论文代码&#xff1a;GitHub - 5AGE-zhang/T…

苹果手机安装Loanmate步骤

1.电脑端下载爱思助手桌面软件并安装 https://www.i4.cn/ 2.苹果手机连接电脑&#xff0c;出现以下成功连接界面 3.切换到应用游戏选项 4.把Loanmate.ipa 包拖到3 界面 5.等待手机安装成功

智能电话机器人的出现,能够解决哪些问题?

经济的繁荣与高速的发展&#xff0c;使得电销这个方式快速地融合在房地产与金融投资等大部分行业上。在电销人员与客户的沟通上&#xff0c;难免会出现很多问题&#xff0c;毕竟所面对的客户都是各行各业&#xff0c;他们有着不同的经历和身份。 对于时常需要处理客户投诉、安…

linux上vscode中.cpp文件中引入头文件.hpp时报错:找不到头文件(启用错误钵形曲线)

当在.cpp文件中引入系统给定的头文件时&#xff1a;#include < iostream > 或者引入自定义的头文件 &#xff1a;#include <success.hpp> 报错&#xff1a;找不到相应的头文件&#xff0c;即在引入头文件的改行底下标出红波浪线 解决方法为&#xff1a; &#…

【前端】CSS-flexbox弹性盒模型布局

目录 一、前言二、flexbox简介三、属性1、容器属性2、容器成员属性 四、容器属性的作用1、flex-direction①、定义②、语句1&#xff09;、属性值 ③、代码示例1&#xff09;、flex-direction: row2&#xff09;、flex-direction: row-reverse3&#xff09;、flex-direction: c…

篇篇10万赞,3D原创动漫视频教程

本期是赤辰第25期AI项目教程&#xff0c;底部准备了8月粉丝福利&#xff0c;可以免费领取。 赤辰AI实操记&#xff0c;专注于AI改造项目与生产方法分享&#xff1a;AI高效变现案例拆解、AI生产力工具使用技巧、改善工作流、AI自动化运营技术等干货分享 今天给大家拆解一个近期…

探讨DPU驱动的高效AI大模型算力底座 中科驭数亮相中国IDC产业(长三角)年度大典

8月31日&#xff0c;以“AI造物 算引变革”为主题的第十八届中国IDC产业&#xff08;长三角&#xff09;年度大典今日在上海隆重召开。大会由中国IDC产业年度大典组委会、上海市通信学会“算力浦江”专委会、中国通信工业协会数据中心委员会联合主办。中科驭数产品运营部副总经…

go学习part21 Redis

300_尚硅谷_Redis的基本介绍和原理示意_哔哩哔哩_bilibili Redis 命令 | 菜鸟教程 (runoob.com) 1.基本介绍 2.基本操作 Redis的基本使用: 说明:Redis安装好后&#xff0c;默认有16个数据库&#xff0c;初始默认使用0号库,编号是0...15 1.添加key-val [set] 2.查看当前redi…

打造全球研发中心城市,湖南湘江新区的挑战与机遇

作者 | 魏启扬 来源 | 洞见新研社 图源&#xff1a;长沙晚报 十年前&#xff0c;中国高铁还在为是选择德国技术&#xff0c;还是日本方案左右为难&#xff0c;如今全面自主化的“复兴号”已有超千组车组投入运营&#xff0c;我们随时可以来一场说走就走的旅行。 十年前&…

【原创】H3C交换机链路聚合配置

图示 中间两个交换机&#xff0c;使用两根网线直连&#xff0c;这样本来是10G级联&#xff0c;变成了20G级联。 在默认情况下&#xff0c;这两根线在STP协议下&#xff0c;只有一路是通的&#xff0c;另一路处于备用状态。如果要将这两路都设置为级联&#xff0c;那么还需要…

MySQL高阶语句之常用查询

目录 常用查询 按关键字排序 区间判断及查询不重复记录 对结果进行分组 限制结果条目 设置别名 通配符 子查询 常用查询 &#xff08;增、删、改、查&#xff09; 对 MySQL 数据库的查询&#xff0c;除了基本的查询外&#xff0c;有时候需要对查询的结果集进行处理。 …