能找到满足条件的记录,则统统列出来。不存在满足条件的记录,则列出来一条“补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);





原创粉丝点击