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模板网!

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

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

相关文章

  • VSCode配置C++环境——弹出黑窗运行和断点调试程序

    前言 先决配置教程 安装拓展 1. Code Runner  2. Tabnine AI Autocomplete 配置文件launch.json  总结 笔者配置了很多次VSCode环境,但越配越烂导致很长一段时间都没有再打开过VSCode,但是VSCode确实轻量级,在打比赛之类的场合很适合快速编写代码(前端另说),既然都是无用的软件了不

    2024年02月05日
    浏览(53)
  • idea编写运行python

    IntelliJ IDEA(通常简称为“IDEA”)是一个功能强大的集成开发环境(IDE),它支持多种编程语言,包括Python。通过安装Python插件,你可以在IDEA中直接编写、运行和调试Python代码。 以下是在IntelliJ IDEA中编写和运行Python代码的步骤: 安装Python插件 : 打开IntelliJ IDEA。 转到“Fi

    2024年04月26日
    浏览(26)
  • VSCode Python调试运行:json编写

    对于需要在命令行传参运行的项目,如果想要调试运行,则需要编写对应的launch.json文件这里记录一下json文件的编写格式: 这里主要区分在于记载模块化运行的情况,即使用 python -m module_name 运行的情况,需要填写“module”这一参数,而 不是在“args”中写“-m”

    2024年01月25日
    浏览(43)
  • RustDay06------Exercise[81-90]

    81.宏函数里面的不同的匹配规则需要使用分号隔开 82.使用内部封装好的宏来替代某些常数 83.if let回顾 84.按照提示修改 这题说明 resize是原地操作 没有返回值 交换值必须要借助中间变量 85.使用as强制转换类型 86.大佬的奇特匹配orz 这题看了大佬的写法,太beautiful了(只有9行) 下

    2024年02月07日
    浏览(37)
  • Jlink+OpenOCD+STM32 Vscode 下载和调试环境搭建

    首先下载编译器:gcc-arm-none-eabi-xxx Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer 对于 Mingw 的安装比较困难,国内的网无法正常在线下载组件, 需要手动下载 x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z 版本的软件包,添加环境变量,并将 mingw32-make.exe 名字改成 make.exe。 MinGW-w6

    2024年04月22日
    浏览(44)
  • 【Unity】【VR开发】针对VR项目的优化版Unity Build Settings

    编辑器中做了功能后,打包后却总会画面不满意,所以到处学习,总结成本篇,希望有用。 本篇总结基于Unity 2021 LTS。 模板选择3D(URP) 如果URP不支持所用的部分Assets,那么也可以选择Built-in管线,不过URP肯定画面效果上要胜过Built-in。 HDRP不适用于移动端,所以不能作为VR一

    2024年02月19日
    浏览(42)
  • C#配置开发环境使用vscode

    1、步骤 (1)下载安装.net (2)测试.net环境 (3)配置vscode的C# 2、操作 (1)下载安装.NET       1.1  简介: .NET是一个类似JDK的.NET SDK概念, 你可以理解为是一个跨平台的运行时环境(runtime) + 命令行等开发者工具的集合。下载链接: https://dotnet.microsoft.com/zh-cn/download        

    2024年02月11日
    浏览(49)
  • Godot4 C# vscode开发环境搭建

    Godot .Net版本: 下载链接 vscode :自行下载 .netcore7:.netcore6可能也行 vscode插件: 1.配置文件用VSCode打开 2.生成C#项目 项目–工具–C#-Create C# Solution, 项目文件如下: 1.打开工程目录 2.创建launch.json与task.json:按.netcore配置,godot插件不顶用 ctrl+shift+p launch.json :\\\"program\\\"换成自己路径

    2024年02月14日
    浏览(81)
  • VSCode调试Python程序需要设置断点、运行调试、单步调试、查看变量值、监视变量、条件断点、调试器设置、调试工具栏等功能,让Python调试轻松愉悦。

    使用VSCode调试Python程序的常用功能及其快捷键如下: 设置断点:在代码中点击行号区域设置断点,或使用快捷键 F9 。 运行调试:按下 F5 运行程序并进入调试模式。 单步调试:使用快捷键 F10 单步执行当前行,使用 F11 单步进入当前行中的函数。 调试停止:使用快捷键 Shif

    2024年02月05日
    浏览(42)
  • 解决MAC中vscode调试C++代码无法处理输入的问题

    写在前面的话:很久没有使用C/C++进行编程了,这次在MAC电脑的vscode中对C/C++代码进行调试时,发现运行到scanf、cin等输入语句时无法输入,参考了网上一些教程,发现有些繁琐或是难以解决我的问题。因此以本文记录最终的解决方案,一来为了记录以便下次遇到时进行解决,

    2024年02月05日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包