能找到滿足條件的記錄,則統統列出來。不存在滿足條件的記錄,則列出來一條“補null”的記錄

執行 表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);





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章