Sự khác biệt của các loại Join trong Oracle?
Join dùng để lấy dữ liệu từ nhiều bảng. Join được thực hiện bất cứ khi nào có hai hoặc nhiều bảng được kết nối trong một câu lệnh SQL. Có nhiều loại Join khác nhau:
1. Cross Join (hoặc đôi lúc còn được gọi là Cartesian Join)
2. Inner Join (Simple Join)
3. Outer Join
Outer Join được chia thành:
- Left Outer Join (Left Join)
- Right Outer Join (Right Join)
- Full Outer Join (Full Join)
1. Cross Join (Cartesian Join)
Cross Join sẽ lấy ra m*n hàng với: m là số lượng hàng trong bảng trái, n là số lượng hàng trong bảng phải.
Ví dụ:
SQL> SELECT * FROM DUP_TEST;
ID NAME
---------- ----------
102 Yasuo
103 Jinx
103 Jinx
103 Jinx
104 Messi
106 Ronaldo
105 Alistar
105 Alistar
8 rows selected.
SQL> SELECT * FROM WILDCARDS;
WILDCARD_ID WILDCARD_VALUE
----------- --------------
8 255
9 127
10 63
11 31
12 15
13 7
14 3
15 1
16 255
17 127
18 63
19 31
20 15
21 7
22 3
23 1
24 255
17 rows selected.
SQL> SELECT * FROM DUP_TEST CROSS JOIN WILDCARDS;
ID NAME WILDCARD_ID WILDCARD_VALUE
---------- ---------- ----------- --------------
102 Yasuo 8 255
102 Yasuo 9 127
102 Yasuo 10 63
102 Yasuo 11 31
102 Yasuo 12 15
102 Yasuo 13 7
102 Yasuo 14 3
102 Yasuo 15 1
102 Yasuo 16 255
102 Yasuo 17 127
102 Yasuo 18 63
................................................
................................................
................................................
105 Alistar 20 15
105 Alistar 21 7
105 Alistar 22 3
105 Alistar 23 1
105 Alistar 24 255
136 rows selected.
hoặc
ID NAME
---------- ----------
102 Yasuo
103 Jinx
103 Jinx
103 Jinx
104 Messi
106 Ronaldo
105 Alistar
105 Alistar
8 rows selected.
SQL> SELECT * FROM WILDCARDS;
WILDCARD_ID WILDCARD_VALUE
----------- --------------
8 255
9 127
10 63
11 31
12 15
13 7
14 3
15 1
16 255
17 127
18 63
19 31
20 15
21 7
22 3
23 1
24 255
17 rows selected.
SQL> SELECT * FROM DUP_TEST CROSS JOIN WILDCARDS;
ID NAME WILDCARD_ID WILDCARD_VALUE
---------- ---------- ----------- --------------
102 Yasuo 8 255
102 Yasuo 9 127
102 Yasuo 10 63
102 Yasuo 11 31
102 Yasuo 12 15
102 Yasuo 13 7
102 Yasuo 14 3
102 Yasuo 15 1
102 Yasuo 16 255
102 Yasuo 17 127
102 Yasuo 18 63
................................................
................................................
................................................
105 Alistar 20 15
105 Alistar 21 7
105 Alistar 22 3
105 Alistar 23 1
105 Alistar 24 255
136 rows selected.
SQL> SELECT * FROM DUP_TEST, WILDCARDS;
ID NAME WILDCARD_ID WILDCARD_VALUE
---------- ---------- ----------- --------------
102 Yasuo 8 255
102 Yasuo 9 127
102 Yasuo 10 63
102 Yasuo 11 31
102 Yasuo 12 15
102 Yasuo 13 7
102 Yasuo 14 3
102 Yasuo 15 1
102 Yasuo 16 255
102 Yasuo 17 127
102 Yasuo 18 63
................................................
................................................
................................................
105 Alistar 20 15
105 Alistar 21 7
105 Alistar 22 3
105 Alistar 23 1
105 Alistar 24 255
136 rows selected.
2. Inner Join (Simple Join)ID NAME WILDCARD_ID WILDCARD_VALUE
---------- ---------- ----------- --------------
102 Yasuo 8 255
102 Yasuo 9 127
102 Yasuo 10 63
102 Yasuo 11 31
102 Yasuo 12 15
102 Yasuo 13 7
102 Yasuo 14 3
102 Yasuo 15 1
102 Yasuo 16 255
102 Yasuo 17 127
102 Yasuo 18 63
................................................
................................................
................................................
105 Alistar 20 15
105 Alistar 21 7
105 Alistar 22 3
105 Alistar 23 1
105 Alistar 24 255
136 rows selected.
Đây là loại Join được dùng phổ biến nhất. Inner Join trả ra tất cả các hàng đều thỏa mảng điều kiện giao nhau.
Ví dụ:
SQL> SELECT T1.ID, T2.JNAME FROM DUP_TEST T1
INNER JOIN JOIN_TEST T2 ON T1.ID = T2.JID;
ID JNAME
---------- --------------------
102 Inner Join
103 Left Join
103 Left Join
103 Left Join
104 Right Join
105 Full Join
105 Full Join
7 rows selected.
hoặc
INNER JOIN JOIN_TEST T2 ON T1.ID = T2.JID;
ID JNAME
---------- --------------------
102 Inner Join
103 Left Join
103 Left Join
103 Left Join
104 Right Join
105 Full Join
105 Full Join
7 rows selected.
SQL> -- Old Syntax
SELECT T1.ID, T2.JNAME FROM DUP_TEST T1, JOIN_TEST T2
WHERE T1.ID = T2.JID;
ID JNAME
---------- --------------------
102 Inner Join
103 Left Join
103 Left Join
103 Left Join
104 Right Join
105 Full Join
105 Full Join
7 rows selected.
SELECT T1.ID, T2.JNAME FROM DUP_TEST T1, JOIN_TEST T2
WHERE T1.ID = T2.JID;
ID JNAME
---------- --------------------
102 Inner Join
103 Left Join
103 Left Join
103 Left Join
104 Right Join
105 Full Join
105 Full Join
7 rows selected.
3. Left Outer Join (Left Join)
Left Outer Join trả ra tất cả các hàng của bảng trái và một số hàng thỏa mãn điều kiện join của bảng phải. Nếu một giá trị trong điều kiện join của bảng phải không tồn tại thì giá trị của cột trả ra của bảng phải là null.
SQL> SELECT T1.ID, T1.NAME, T2.JNAME FROM DUP_TEST T1
LEFT JOIN JOIN_TEST T2 ON T1.ID = T2.JID;
ID NAME JNAME
---------- ---------- --------------------
102 Yasuo Inner Join
103 Jinx Left Join
103 Jinx Left Join
103 Jinx Left Join
104 Messi Right Join
105 Alistar Full Join
105 Alistar Full Join
106 Ronaldo
8 rows selected.
SQL> -- Old Syntax
SELECT T1.ID, T1.NAME, T2.JNAME
FROM DUP_TEST T1, JOIN_TEST T2 WHERE T1.ID = T2.JID(+);
ID NAME JNAME
---------- ---------- --------------------
102 Yasuo Inner Join
103 Jinx Left Join
103 Jinx Left Join
103 Jinx Left Join
104 Messi Right Join
105 Alistar Full Join
105 Alistar Full Join
106 Ronaldo
LEFT JOIN JOIN_TEST T2 ON T1.ID = T2.JID;
ID NAME JNAME
---------- ---------- --------------------
102 Yasuo Inner Join
103 Jinx Left Join
103 Jinx Left Join
103 Jinx Left Join
104 Messi Right Join
105 Alistar Full Join
105 Alistar Full Join
106 Ronaldo
8 rows selected.
SQL> -- Old Syntax
SELECT T1.ID, T1.NAME, T2.JNAME
FROM DUP_TEST T1, JOIN_TEST T2 WHERE T1.ID = T2.JID(+);
ID NAME JNAME
---------- ---------- --------------------
102 Yasuo Inner Join
103 Jinx Left Join
103 Jinx Left Join
103 Jinx Left Join
104 Messi Right Join
105 Alistar Full Join
105 Alistar Full Join
106 Ronaldo
Ngược lại với Left Outer Join thì Right Outer Join trả ra tất cả các hàng của bảng phải và một số hàng thỏa mãn điều kiện join của bảng trái. Nếu một giá trị trong điều kiện join của bảng trái không tồn tại thì giá trị của cột trả ra của bảng trái là null.
SQL> SELECT T1.ID, T1.NAME, T2.JNAME FROM DUP_TEST T1
RIGHT JOIN JOIN_TEST T2 ON T1.ID = T2.JID;
ID NAME JNAME
---------- ---------- --------------------
102 Yasuo Inner Join
103 Jinx Left Join
103 Jinx Left Join
103 Jinx Left Join
104 Messi Right Join
105 Alistar Full Join
105 Alistar Full Join
Cross Join
8 rows selected.
SQL> -- Old Syntax
SELECT T1.ID, T1.NAME, T2.JNAME
FROM DUP_TEST T1, JOIN_TEST T2 ON T1.ID(+) = T2.JID;
ID NAME JNAME
---------- ---------- --------------------
102 Yasuo Inner Join
103 Jinx Left Join
103 Jinx Left Join
103 Jinx Left Join
104 Messi Right Join
105 Alistar Full Join
105 Alistar Full Join
Cross Join
8 rows selected.
RIGHT JOIN JOIN_TEST T2 ON T1.ID = T2.JID;
ID NAME JNAME
---------- ---------- --------------------
102 Yasuo Inner Join
103 Jinx Left Join
103 Jinx Left Join
103 Jinx Left Join
104 Messi Right Join
105 Alistar Full Join
105 Alistar Full Join
Cross Join
8 rows selected.
SQL> -- Old Syntax
SELECT T1.ID, T1.NAME, T2.JNAME
FROM DUP_TEST T1, JOIN_TEST T2 ON T1.ID(+) = T2.JID;
ID NAME JNAME
---------- ---------- --------------------
102 Yasuo Inner Join
103 Jinx Left Join
103 Jinx Left Join
103 Jinx Left Join
104 Messi Right Join
105 Alistar Full Join
105 Alistar Full Join
Cross Join
8 rows selected.
(ORA-00021) - JOIN
Reviewed by Uit Lân
on
12/18/2018 01:18:00 SA
Rating:

Không có nhận xét nào: