能找到满足条件的记录,则统统列出来。不存在满足条件的记录,则列出来一条“补null”的记录
2012-06-22 10:11
232 查看
执行 表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
2、LEFT JOIN 的 SQL
下面是我们的结果:
被我划掉的 1 部分是错误的,举例来说明:
对于上面的 SQL,L_ID<4 只涉及到 EI.LTABLE,
1.1 如果此处说的对,则,过滤后,左表 只剩下 L_ID=3 的那一条记录
1.2 从而,最后的结果集只能有 L_ID=3 的记录
事实当然不是这样,就像所有其他的 Left Join 一样,最后的结果集包含了 左表 EI.LTABLE 中的所有记录
列出完整的 SQL,以及最后 SELECT 的执行结果
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);
相关文章推荐
- 查询分组数据指行条件满足的行的上一条记录的技巧
- 使用Sqlite Select返回满足条件的第一条与最后一条记录
- 使用Sqlite Select返回满足条件的第一条与最后一条记录
- Sql2005 tips 按照某些条件(一个or多个)分组,取分组中满足某个条件的一条记录
- HQL取满足条件最新一条记录(max()函数的使用)
- Mysql 对满足一定条件的 计数 常用的一条sql
- 7、使用WHERE子句查询表中满足条件的记录
- Mysql 按条件排序查询一条记录 top 1 对应Mysql的LIMIT 关键字
- thinkphp 根据条件查数据库存在记录则修改 不存在则添加
- PHP查询数据库中满足条件的记录条数(二种实现方法)
- SQL 问题:已知主键id 和排序条件 这条记录的上一条或下一条记录
- Sql 更新所有满足条件记录里第一条记录
- 进行异常捕获,查询lastname为smith的员工信息,如果该员工不存在,则插入一条新记录;如果存在多个同名的员工,则输出其员工号,姓名和工资
- hibernate查询满足指定条件的记录
- C++ 数据库开发 如何获取表中满足某条件的记录数量
- 怎么去除table多余出来的行,我的table里面只显示一条记录,但是下面出现很多空白的行,要怎么去掉
- hibernate使用list映射,查询出来的list集合包含多个null记录
- thinkphp中volist if条件判断最后一条记录
- PHP查询数据库中满足条件的记录条数(两种实现方法)
- sql实现满足某些条件的记录是否存在