当前位置: 首页 > news >正文

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_DESCFROM FACT_TAB ALEFT JOIN DIM_STATUS BON A.STATUS = B.STATUS_CODEAND 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_DESCFROM FACT_TAB ALEFT JOIN (SELECT * FROM DIM_STATUS WHERE STATUS_CODE = '1') BON A.STATUS = B.STATUS_CODEAND 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_DESCFROM FACT_TAB ALEFT JOIN DIM_STATUS BON A.STATUS = B.STATUS_CODEAND 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_DESCFROM FACT_TAB ALEFT JOIN DIM_STATUS BON A.STATUS = B.STATUS_CODEAND 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_DESCFROM FACT_TAB ALEFT JOIN DIM_STATUS BON A.STATUS = B.STATUS_CODEAND 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_DESCFROM FACT_TAB ALEFT JOIN DIM_STATUS BON A.STATUS = B.STATUS_CODEAND 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的异同

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),S…...

Flink实时计算中台Kubernates功能改造点

背景 平台为数据开发人员提供基本的实时作业的管理功能,其中包括jar、sql等作业的在线开发;因此中台需要提供一个统一的SDK支持平台能够实现flink jar作业的发布;绝大多数情况下企业可能会考虑Flink On Yarn的这个发布模式,但是伴随云原生的呼声越来越大,一些企业不希望部…...

GO远程构建并调试

GO远程调试 之前写C,一直习惯了本地IDERemote CMake/GDB编译调试的模式。 因为6.824课程需要用GO,好像没有特别好的支持。记录一下如何配置调试的。 IDE: Goland 操作系统:Windows 远程服务器:Ubuntu 首先配置SSH,让其可以连接到…...

react使用hook封装一个search+input+checkbox组件

目录 react使用hook封装一个searchinputcheckbox组件searchPro.jsx使用组件效果 react使用hook封装一个searchinputcheckbox组件 searchPro.jsx import { Checkbox, Input } from "antd"; import React, { useEffect, useState } from "react"; import S…...

【6】uniform颜色写入

之前的Basic.shader: #shader vertex #version 330 corelayout(location 0) in vec4 position;void main() {gl_Position position; };#shader fragment #version 330 corelayout(location 0) out vec4 color;void main() {color vec4(1.0, 0.0, 0.0, 1.0); };这里color …...

自然语言处理历史史诗:NLP的范式演变与Python全实现

目录 一、引言什么是自然语言处理?语言与人类思维自然语言的复杂性NLP的历史轨迹 二、20世纪50年代末到60年代的初创期符号学派重要的研究和突破 随机学派重要的研究和突破 三、20世纪70年代到80年代的理性主义时代基于逻辑的范式重要的研究和突破 基于规则的范式重…...

网络协议从入门到底层原理学习(二)—— Mac地址/IP地址

文章目录 网络协议从入门到底层原理学习(二)—— Mac地址/IP地址1、MAC地址2、MAC地址的表示格式3、MAC地址表4、MAC地址操作5、MAC地址的获取6、ARP7、ICMP8、IP地址9、IP地址的分类和格式10、不同分类的IP地址的范围11、特殊 IP 地址12、子网掩码13、子…...

2023开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆

2023开学礼中国海洋大学《乡村振兴战略下传统村落文化旅游设计》许少辉新海洋图书馆...

WebClient vs HttpClient:异同对比

在 Java 开发中,进行网络通信是常见的需求。WebClient 和 HttpClient 是两种常用的用于发送 HTTP 请求的工具。它们都具有相似的功能,但在实现细节和用法上存在一些差异。本文将详细介绍 WebClient 和 HttpClient 的异同,帮助您选择适合您项目…...

ES6中导入import导出export

ES6使用 export 和 import 来导出、导入模块 用法 /** 导出 export *///分别导出 export let name 孙悟空; export function sum(a, b) {return a b; } } //先定义再导出 let age 18 export {age}/** 默认导出 export default */const a 默认导出; export default a;/**…...

【MySQlL学习笔记】(九)内外连接

内外连接 内连接外连接左外连接右外连接 表的连接分为内连和外连 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。 语法: select 字段 from 表…...

敦煌https证书能做些什么

随着互联网技术的不断发展,人们的生活方式和社交方式也发生了巨大的变化。互联网已经成为人们生活中不可或缺的一部分,它不仅提供了方便快捷的信息获取方式,还为人们提供了一个全新的社交平台。 然而,随着互联网的不断发展&#x…...

React笔记(六)React路由

一、React路由简介 React 官方并没有提供对应的路由插件,因此,我们需要下载第三方的路由插件 —— React Router DOM。 React Router 在 2021 年 11 月份的时候更新 v6 的版本。本次课就主要讲解V6版本 二、路由配置 1、下载路由 在项目根目录中&am…...

【算法系列篇】分治-归并

文章目录 前言什么是归并算法1. 排序数组1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 数组中逆序对2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 计算右侧小于当前元素的个数3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 翻转对4.1 题目要求4.2 做题思路4.3 Java代码实现 总…...

word导出为HTML格式教程,同时也导出图片

在写文档教程时,有时需要借鉴人家的专业文档内容,一般都是word格式文档。word直接复制里面的内容,帐帖到网站编辑器会有很多问题,需要二次清楚下格式才行,而且图片是没办法直接复制到编辑器内的。所以最方便的办法是将…...

事务的优化

例子: 举例:假设我们有一个文件上传的uploadFile方法,在这个方法中我们会先执行上传一个文件到分布式文件系统中的方法addMediaFilesToMinIO( ),上传成功后执行文件资源数据入库的addMediaFilesToDb( ),那么这个时候事务应该加在哪…...

VMware虚拟机安装_新虚拟机创建_CentOS镜像导入_linux指令基本操作

文章目录 1 VMware下载安装1.1 下载网址1.2 安装步骤 2 创建虚拟机与CentOS镜像导入2.1 创建新虚拟机2.2 导入CentOS镜像 3 获取ip与连接Xshell3.1 查看虚拟机ip地址3.2 Xshell使用 1 VMware下载安装 1.1 下载网址 https://www.vmware.com/cn/products/workstation-pro/works…...

Git常用命令用法

参考视频:真的是全能保姆 git、github 保姆级教程入门,工作和协作必备技术,github提交pr - pull request_哔哩哔哩_bilibili 1.Git初始化 首先设置名称和邮箱。然后初始化一下,然后就创建了一个空的Git仓库。 PS D:\golang\oth…...

电子元器件采购的数字化转型:智能采购工具的应用

电子元器件采购的数字化转型是采购领域的一项重要趋势,智能采购工具的应用在此过程中发挥了关键作用。以下是智能采购工具在电子元器件采购数字化转型中的应用方面的一些关键点: 供应链可见性: 智能采购工具可以提供对供应链的实时可见性。通…...

【RuoYi移动端】uni-app中通过vuex的store来实现全局变量的修改和读取

一、在store文件中新建csjVar.js文件 const csjVar {csjMess: [{aaa:"ok"},{bbb:"no"}] } export default csjVar 二、修改store文件中新建index.js文件 import Vue from vue import Vuex from vuex import user from /store/modules/user import gette…...

OpenClaw自动化测试:nanobot驱动浏览器执行回归用例

OpenClaw自动化测试:nanobot驱动浏览器执行回归用例 1. 为什么选择OpenClaw进行自动化测试 去年接手一个老项目时,我遇到了一个典型的前端测试困境——每次发版前需要手动执行87个回归测试用例,整个过程耗时近4小时。尝试过Selenium和Playw…...

CodeBlocks-25.03 在 Windows 上的完整配置与避坑指南

1. 为什么选择CodeBlocks-25.03? 如果你刚开始学习C/C编程,CodeBlocks绝对是个不错的选择。作为一个开源的集成开发环境(IDE),它轻量级、跨平台,最重要的是完全免费。我十年前刚开始写代码时用的就是CodeBl…...

基于Session管理的在线视频学习平台防作弊策略

1. Session管理在在线学习平台中的核心作用 在线视频学习平台最头疼的问题之一,就是如何防止用户通过多设备同时登录来刷学习进度。想象一下,如果用户同时在手机、平板和电脑上登录同一个账号,三倍速刷完课程,这对其他认真学习的用…...

别再手动算占空比了!手把手教你用TI C2000 EPWM互补输出驱动电机(附死区配置避坑指南)

从零到精通的TI C2000 EPWM电机驱动实战:死区配置与波形调试全解析 在电机控制领域,精确的PWM信号生成直接决定了系统性能和可靠性。传统的手动计算占空比方式不仅效率低下,还容易引入人为误差。TI C2000系列DSP内置的增强型PWM模块&#xff…...

嵌入式Linux C语言开发核心技术与实践

嵌入式Linux开发中的C语言编程要点解析1. 嵌入式C语言开发概述1.1 嵌入式环境特点在嵌入式Linux开发中,C语言作为主要编程语言具有不可替代的地位。与通用计算机环境相比,嵌入式系统具有资源受限、实时性要求高、硬件接口特殊等特点,这些特性…...

Font-Awesome-SVG-PNG 核心原理:深入解析SVG到PNG的转换机制

Font-Awesome-SVG-PNG 核心原理:深入解析SVG到PNG的转换机制 【免费下载链接】Font-Awesome-SVG-PNG Font Awesome split to individual SVG and PNG files of different sizes along with Node.JS based generator 项目地址: https://gitcode.com/gh_mirrors/fo/…...

Mac系统Jmeter从零到一:接口压力测试实战入门

1. 为什么选择Jmeter做接口压力测试 最近接手一个需求:需要对某个关键接口进行100次循环压力测试,检查是否存在偶发性返回数据为空的问题。作为Mac用户,我第一时间想到了Jmeter这个工具。你可能好奇为什么不用Postman或者curl脚本&#xff1…...

从零到一:在Windows系统上部署JDK11与Neo4j 4.3.5开发环境

1. 环境准备:JDK11与Neo4j 4.3.5的版本选择 刚开始接触Java和图数据库时,我踩过不少版本不兼容的坑。比如有一次装了最新版JDK17,结果Neo4j死活启动不了,折腾半天才发现是版本冲突。所以现在每次搭建环境,我都会先确认…...

全面解析数据库锁机制:从行锁到死锁的深度剖析

锁是数据库并发控制的核心机制,也是面试中绕不开的高频考点。很多开发者对锁的理解停留在“加锁就行了”,但遇到死锁、锁等待超时、性能骤降等问题时往往束手无策。本文将系统讲解数据库锁的分类、实现原理、锁与事务隔离级别的关系,并结合 M…...

电机控制进阶:从增量式与位置式PID到现代复合控制策略

1. PID控制的前世今生:从工业革命到智能时代 第一次接触PID控制器时,我被这个诞生于上世纪30年代的"古董级"算法震惊了。当时正在调试一台伺服电机,系统总是出现超调和振荡。导师递给我一张写着三个参数的纸条:"试…...