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