您的位置:首页 > 其它

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

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);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐