能找到满足条件的记录,则统统列出来。不存在满足条件的记录,则列出来一条“补null”的记录
来源:互联网 发布:~计算机编程语言 编辑:程序博客网 时间:2024/04/28 04:36
执行 表A join 表B 的 ON 条件时,
1、ON 中的某些条件(ON的条件可以有多个的)仅仅涉及到其中的一个表,设其为 表A ,则首先在 表A 上应用此条件
说法错误。(这是我以前的错误理解,不删除了,划掉吧,也算是自己的理解历程了)
2、选定 表A 中的一条记录,然后从头到尾遍历 表B
遍历 表B 时,如果 表B 中的某条记录满足 ON中的所有条件,则将表A 中的选定记录 和 表B 中的这个当前记录 串一条大大的记录,放入结果表。3、对于 表A 中的选定记录,表B 已经遍历完成
3.1 表B 中至少有一个满足了ON中的所有条件。好,啥都不需要作
3.2 表B 不存在满足ON中的所有条件的记录,则将表A 中的选定记录 和 n 个 null 串一条大大的记录(n是 表B 的总列数),放入结果表
4、选定 表A 的下一条记录,重复 步骤 2 和 3
5、得到了 结果表,从结果表中选出 SELECT 中需要的列
我们来试验一下:
1、建表 以及 插入数据 的 SQL
DROP TABLE EI.LTABLE;CREATE TABLE EI.LTABLE ( L_ID INTEGER NOT NULL, L_DESCRIPTION VARCHAR (100), CONSTRAINT PK_LTABLE PRIMARY KEY (L_ID) );INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (1, 'L 1');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (2, 'L 2');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (3, 'L 3');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (4, 'L 4');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (5, 'L 5');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (6, 'L 6');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (7, 'L 7');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (8, 'L 8');DROP TABLE EI.RTABLE;CREATE TABLE EI.RTABLE ( R_ID INTEGER NOT NULL, R_DESCRIPTION VARCHAR (100), CONSTRAINT PK_RTABLE PRIMARY KEY (R_ID) );INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (5, 'R 5');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (6, 'R 6');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (7, 'R 7');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (8, 'R 8');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (9, 'R 9');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (10, 'R 10');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (11, 'R 11');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (12, 'R 12');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (13, 'R 13');
2、LEFT JOIN 的 SQL
--注意:我们使用 > 而不是常用的 =SELECT * FROM EI.LTABLE LEFT JOIN EI.RTABLE ON L_ID > R_ID ORDER BY L_ID;
下面是我们的结果:
被我划掉的 1 部分是错误的,举例来说明:
SELECT * FROM EI.LTABLE LEFT JOIN EI.RTABLE ON (L_ID<4 OR R_ID>100);
对于上面的 SQL,L_ID<4 只涉及到 EI.LTABLE,
1.1 如果此处说的对,则,过滤后,左表 只剩下 L_ID=3 的那一条记录
1.2 从而,最后的结果集只能有 L_ID=3 的记录
事实当然不是这样,就像所有其他的 Left Join 一样,最后的结果集包含了 左表 EI.LTABLE 中的所有记录
列出完整的 SQL,以及最后 SELECT 的执行结果
DROP TABLE EI.LTABLE;CREATE TABLE EI.LTABLE ( L_ID INTEGER NOT NULL, L_DESCRIPTION VARCHAR (100), CONSTRAINT PK_LTABLE PRIMARY KEY (L_ID) );INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (3, 'L 3');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (9, 'L 9');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (4, 'L 4');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (5, 'L 5');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (6, 'L 6');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (7, 'L 7');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (8, 'L 8');INSERT INTO EI.LTABLE(L_ID, L_DESCRIPTION) VALUES (10, 'L 10');DROP TABLE EI.RTABLE;CREATE TABLE EI.RTABLE ( R_ID INTEGER NOT NULL, R_DESCRIPTION VARCHAR (100), CONSTRAINT PK_RTABLE PRIMARY KEY (R_ID) );INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (5, 'R 5');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (6, 'R 6');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (7, 'R 7');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (8, 'R 8');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (9, 'R 9');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (10, 'R 10');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (11, 'R 11');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (12, 'R 12');INSERT INTO EI.RTABLE(R_ID, R_DESCRIPTION) VALUES (13, 'R 13');SELECT * FROM EI.LTABLE LEFT JOIN EI.RTABLE ON (L_ID<4 OR R_ID>100);
- 能找到满足条件的记录,则统统列出来。不存在满足条件的记录,则列出来一条“补null”的记录
- hibernate查询满足指定条件的记录
- 删除表中满足条件的记录
- 取满足所有条件的记录
- oracle触发器 判断插入的记录是否满足条件,如果满足,则在b表中插入相应记录
- 判断数据表中有无满足条件的记录,有则提示已有记录
- 查询分组数据指行条件满足的行的上一条记录的技巧
- Excel 中列出所有满足条件的项
- HQL取满足条件最新一条记录(max()函数的使用)
- 使用Sqlite Select返回满足条件的第一条与最后一条记录
- select count(*) 查询满足条件的记录的条数
- 查找限制数目的满足条件的记录条数
- 使用where子句查询表中满足条件的记录
- list 中删除满足某个条件的所有记录
- 找到满足条件的数组
- mysql查询列出不包涵条件的记录
- oracle中用一条select 语句把符合多个条件的查询结果列出来
- Sql2005 tips 按照某些条件(一个or多个)分组,取分组中满足某个条件的一条记录
- Programming Question-1-Inversion Numbers
- 争取一份嵌入式,物联网方向的实习机会
- 比较两波形的相似度
- intent.setFlags方法中的参数值含义
- linux oracle10g安装
- 能找到满足条件的记录,则统统列出来。不存在满足条件的记录,则列出来一条“补null”的记录
- 随笔十四:十进制与十六进制转换
- LPC17XX串口接收数据死机现象解决办法
- Visual Studio 2010单元测试
- java输出'联通'记事本的那些乱码
- linux查看系统启动时间
- 十进制和十六进制的转换
- iOS官方Sample大全
- FileNotFoundException, Could not find file 'C:\WINDOWS\TEMP\wpbzwlwo.dll'.