Oracle Left Join 理解
Oracle Left Join 理解
表A
ID | CODE | STATUS | OUT_CODE |
---|---|---|---|
1 | A1 | 0 | B1 |
表B
ID | CODE | STATUS |
---|---|---|
1 | B1 | 0 |
2 | B1 | 1 |
场景一
-- 执行SQL1
SELECT * FROM A a LEFT JOIN B b ON b.CODE = a.OUT_CODE WHERE a.CODE = 'A1' AND a.STATUS = 0 AND b.STATUS = 0;
-- 执行SQL2
SELECT * FROM A a LEFT JOIN B b ON b.CODE = a.OUT_CODE AND b.STATUS = 0 WHERE a.CODE = 'A1' AND a.STATUS = 0;
SQL1
和SQL2
结果都为:
ID | CODE | STATUS | OUT_CODE | ID(1) | CODE(1) | STATUS(1) |
---|---|---|---|---|---|---|
1 | A1 | 0 | B1 | 1 | B1 | 0 |
但是SQL
顺序不同
-
SQL1
执行顺序先根据
b.CODE = a.OUT_CODE
得到数据(两张表数据根据ON条件笛卡尔积)ID CODE STATUS OUT_CODE ID(1) CODE(1) STATUS(1) 1 A1 0 B1 1 B1 0 1 A1 0 B1 2 B1 1 再根据
a.CODE = 'A1' AND a.STATUS = 0 AND b.STATUS = 0
得到数据ID CODE STATUS OUT_CODE ID(1) CODE(1) STATUS(1) 1 A1 0 B1 1 B1 0 -
SQL2
执行顺序先根据
b.CODE = a.OUT_CODE AND b.STATUS = 0
得到数据(两张表数据根据ON条件笛卡尔积)ID CODE STATUS OUT_CODE ID(1) CODE(1) STATUS(1) 1 A1 0 B1 1 B1 0 再根据
a.CODE = 'A1' AND a.STATUS = 0
得到数据ID CODE STATUS OUT_CODE ID(1) CODE(1) STATUS(1) 1 A1 0 B1 1 B1 0
场景二
-- 修改B表ID=1的STATUS为1
UPDATE B SET STATUS = 1 WHERE ID = '1';
-- 执行SQL1
SELECT * FROM A a LEFT JOIN B b ON b.CODE = a.OUT_CODE WHERE a.CODE = 'A1' AND a.STATUS = 0 AND b.STATUS = 0
-- 执行SQL2
SELECT * FROM A a LEFT JOIN B b ON b.CODE = a.OUT_CODE AND b.STATUS = 0 WHERE a.CODE = 'A1' AND a.STATUS = 0
SQL1
得到结果:
ID | CODE | STATUS | OUT_CODE | ID(1) | CODE(1) | STATUS(1) |
---|---|---|---|---|---|---|
NULL | NULL | NULL | NULL | NULL | NULL | NULL |
SQL12
得到结果:
ID | CODE | STATUS | OUT_CODE | ID(1) | CODE(1) | STATUS(1) |
---|---|---|---|---|---|---|
1 | A1 | 0 | B1 | NULL | NULL | NULL |
结论
LEFT JOIN
先查询出左表数据,再根据ON
条件得到右表数据并和左表数据做笛卡尔积,最后根据WHERE
条件得到最后数据
本文作者:Zzzy君不见
本文链接:https://www.cnblogs.com/Zzzyyw/p/16955937.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步