Join์ ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ์ ๊ฒฐํฉํ๋ ๊ฒ ์ธ์๋ ๋๊ฐ์ ํ ์ด๋ธ์ ํฉ์น๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ์ด๊ฒ์ Self Join์ด๋ผ๊ณ ํ๋๋ฐ, ์ด๋ฒ ํฌ์คํ ์์๋ LeetCode ๋ฌธ์ ํ์ด๋ฅผ ํตํด Self Join์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
Self Join
- Self Join์ด๋ ๋์ผํ ํ ์ด๋ธ ์ฌ์ด์ ์กฐ์ธ์ ์๋ฏธ
- ๊ฐ์ ํ ์ด๋ธ๋ผ๋ฆฌ์ ์กฐ์ธ์ด๊ธฐ ๋๋ฌธ์, ๊ตฌ๋ถ์ ์ํด ALIAS๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํจ
SELECT *
FROM table1 AS A
INNER JOIN table1 AS B ON A.id = B.id;
๋ฌธ์
Write an SQL query to find the employees who earn more than their managers.
Return the result table in any order.
The query result format is in the following example.
๋ฌธ์ ํด์
๋งค๋์ ๋ณด๋ค ๋ด๊ธ์ด ๋์ ์ง์์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์์ ์์๋ฅผ ๋ณด๋ฉด, ์ต์ข ์ปฌ๋ผ๋ช ์ Employee๋ก ์นํ๋์ด์ผ ํ๋ฉฐ Employee์ name์ ์ถ์ถํ๋ฉด ๋๋ค. ํ ์ด๋ธ์๋ ๋ชจ๋ ์ง์์ id์ ๊ฐ ์ง์์ ๋ด๋นํ๊ณ ์๋ managerId๊ฐ ์กด์ฌํ๋ค. Joe์ ๋งค๋์ ๋ Sam์ด๊ณ , Henry์ ๋งค๋์ ๋ Max์ด๋ค. ์ฃผ์ด์ง ํ ์ด๋ธ์ด ํ๋์ด๋ฏ๋ก, ํ๋์ ํ ์ด๋ธ์ ๋ ๊ฐ์ ํ ์ด๋ธ์ฒ๋ผ ์กฐ์ธํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถ์ถํด์ผ ํ๋ค.
์ฟผ๋ฆฌ
SELECT Employee.name AS Employee
FROM Employee
INNER JOIN Employee AS Manager ON Employee.ManagerId = Manager.Id
WHERE Employee.Salary > Manager.Salary;
๋ฌธ์ ํ์ด
- ๋์ผํ ํ ์ด๋ธ์ Joinํ๊ธฐ ๋๋ฌธ์, ์ฃผ์ด์ง ์ปฌ๋ผ๊ณผ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ค. ๋ฐ๋ผ์ Outer Join์ด ์๋, Inner Join์ ์ด์ฉํ๋ค.
- Employee ํ ์ด๋ธ์ Self Join ํ๋ค๊ณ ํ ๋, ์ด๋ค ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ก์ ๊ฒ์ธ์ง๋ฅผ ํ์ธํด์ผ ํ๋ค. ์ ์๋ ํ ์ด๋ธ์ ๋ณด๋ฉด, managerId์ id๊ฐ ๊ฒน์น๋ ๊ตฌ๊ฐ์ด ์์์ ํ์ธํ ์ ์์ด ํด๋น ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ์ก์ผ๋ฉด ๋๋ค.
- Employee ํ ์ด๋ธ์๋ ์ง์ ๊ฐ์ธ์ id๋ ์กด์ฌํ์ง๋ง ๋งค๋์ ๋ค์ id๋ ๋์์ managerId๋ก์จ์ ์ญํ ๋ ์ํํ๋ค.
- Employee ํ ์ด๋ธ์ Manager ํ ์ด๋ธ์ด๋ผ๊ณ ์นํํ๋ฉด, Manager ํ ์ด๋ธ์ Id ๊ฐ๊ณผ Employee ํ ์ด๋ธ์ managerId ๊ฐ์ด ์ผ์นํ๋ ๊ตฌ๊ฐ์ ์กฐ์ธ์ ์ํ ๊ธฐ์ค์ ์ผ๋ก ์ก์ ์ ์๋ค.
- ๋ฌธ์ ํ์ด๋ฅผ ์ํ ํต์ฌ ์กฐ๊ฑด์ "๋งค๋์ ๋ณด๋ค ๋ด๊ธ์ด ๋์ ์ง์"์ด๋ค. ๋ฐ๋ผ์ WHERE์ ์ ์ฝ์ ํ์ฌ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๋ค.