SQL의 셀프 조인은 테이블이 자체적으로 조인되는 조인 유형입니다. 동일한 테이블 내의 행을 비교하거나 동일한 데이터세트에서 관련 데이터를 검색하려는 경우 유용합니다. 셀프 조인은 계층적 관계(예: 직원-관리자 구조)를 모델링하거나 세트 내에서 조합(예: 팀 간 가능한 매치업)을 찾는 데 자주 사용됩니다.
셀프 조인은 다른 별칭을 사용하여 테이블이 자체적으로 조인되는 일반 조인입니다. 기본적으로 테이블의 행을 동일한 테이블 내의 다른 행과 비교하는 데 사용됩니다.
SELECT a.column1, b.column2 FROM table_name a JOIN table_name b ON a.common_column = b.common_column;
시나리오:
직원 테이블이 있고 어떤 직원이 어떤 관리자에게 보고하는지 알아야 합니다. 테이블의 각 행에는 직원의 세부 정보가 포함되며 ManagerID 열에는 관리자의 EmployeeID가 포함됩니다.
샘플 테이블 생성 및 데이터 삽입:
-- Create the Employees table CREATE TABLE Employees ( EmployeeID NUMBER PRIMARY KEY, EmployeeName VARCHAR2(50), ManagerID NUMBER );
-- Insert sample data INSERT INTO Employees (EmployeeID, EmployeeName, ManagerID) VALUES (1, 'John', NULL); INSERT INTO Employees (EmployeeID, EmployeeName, ManagerID) VALUES (2, 'Mike', 1); INSERT INTO Employees (EmployeeID, EmployeeName, ManagerID) VALUES (3, 'Sarah', 1); INSERT INTO Employees (EmployeeID, EmployeeName, ManagerID) VALUES (4, 'Kate', 2); INSERT INTO Employees (EmployeeID, EmployeeName, ManagerID) VALUES (5, 'Tom', 2); -- Commit the changes COMMIT;
Oracle의 Self-Join 쿼리:
SELECT e1.EmployeeName AS Employee, e2.EmployeeName AS Manager FROM Employees e1 LEFT JOIN Employees e2 ON e1.ManagerID = e2.EmployeeID;
설명:
LEFT JOIN은 관리자가 없는 직원(ManagerID가 NULL)을 포함하여 모든 직원을 포함하는 데 도움이 됩니다.
출력:
Employee | Manager |
---|---|
John | NULL |
Mike | John |
Sarah | John |
Kate | Mike |
Tom | Mike |
시나리오:
IPL 팀 목록이 있고 각 팀이 다른 팀과 한 번씩 대결하는 경기 목록을 생성하려고 합니다.
샘플 테이블 생성 및 데이터 삽입:
-- Create the Teams table CREATE TABLE Teams ( TeamID NUMBER PRIMARY KEY, TeamName VARCHAR2(100) );
-- Insert sample data INSERT INTO Teams (TeamID, TeamName) VALUES (1, 'Mumbai Indians'); INSERT INTO Teams (TeamID, TeamName) VALUES (2, 'Chennai Super Kings'); INSERT INTO Teams (TeamID, TeamName) VALUES (3, 'Royal Challengers Bangalore'); INSERT INTO Teams (TeamID, TeamName) VALUES (4, 'Kolkata Knight Riders'); -- Commit the changes COMMIT;
Oracle의 Self-Join 쿼리:
SELECT t1.TeamName AS Team1, t2.TeamName AS Team2 FROM Teams t1 JOIN Teams t2 ON t1.TeamID < t2.TeamID;
설명:
조건 t1.TeamID < t2.TeamID는 각 경기 쌍이 한 번만 나열되도록 보장합니다(A팀 대 B팀, B팀 대 A팀과 같은 중복 방지).
출력:
Team1 | Team2 |
---|---|
Mumbai Indians | Chennai Super Kings |
Mumbai Indians | Royal Challengers Bangalore |
Mumbai Indians | Kolkata Knight Riders |
Chennai Super Kings | Royal Challengers Bangalore |
Chennai Super Kings | Kolkata Knight Riders |
Royal Challengers Bangalore | Kolkata Knight Riders |
Scenario:
You want to generate a list where each IPL team plays against every other team twice (once as the home team, and once as the away team).
Self-Join Query in Oracle:
SELECT t1.TeamName AS Team1, t2.TeamName AS Team2 FROM Teams t1 JOIN Teams t2 ON t1.TeamID != t2.TeamID;
Explanation:
The condition t1.TeamID != t2.TeamID ensures that all possible match-ups are listed, including both Team A vs. Team B and Team B vs. Team A.
Output:
Team1 | Team2 |
---|---|
Mumbai Indians | Chennai Super Kings |
Mumbai Indians | Royal Challengers Bangalore |
Mumbai Indians | Kolkata Knight Riders |
Chennai Super Kings | Mumbai Indians |
Chennai Super Kings | Royal Challengers Bangalore |
Chennai Super Kings | Kolkata Knight Riders |
Royal Challengers Bangalore | Mumbai Indians |
Royal Challengers Bangalore | Chennai Super Kings |
Royal Challengers Bangalore | Kolkata Knight Riders |
Kolkata Knight Riders | Mumbai Indians |
Kolkata Knight Riders | Chennai Super Kings |
Kolkata Knight Riders | Royal Challengers Bangalore |
Scenario:
You have a Customers table where each customer should have a unique combination of FirstName, LastName, and DateOfBirth. However, there may be accidental duplicates, and you want to identify them using a self-join.
Sample Table Creation and Data Insertion:
-- Create the Customers table CREATE TABLE Customers ( CustomerID NUMBER PRIMARY KEY, FirstName VARCHAR2(50), LastName VARCHAR2(50), DateOfBirth DATE );
-- Insert sample data (including duplicates) INSERT INTO Customers (CustomerID, FirstName, LastName, DateOfBirth) VALUES (1, 'John', 'Doe', TO_DATE('1990-01-01', 'YYYY-MM-DD')); INSERT INTO Customers (CustomerID, FirstName, LastName, DateOfBirth) VALUES (2, 'Jane', 'Smith', TO_DATE('1992-02-02', 'YYYY-MM-DD')); INSERT INTO Customers (CustomerID, FirstName, LastName, DateOfBirth) VALUES (3, 'John', 'Doe', TO_DATE('1990-01-01', 'YYYY-MM-DD')); INSERT INTO Customers (CustomerID, FirstName, LastName, DateOfBirth) VALUES (4, 'Alice', 'Johnson', TO_DATE('1995-03-03', 'YYYY-MM-DD')); INSERT INTO Customers (CustomerID, FirstName, LastName, DateOfBirth) VALUES (5, 'John', 'Doe', TO_DATE('1990-01-01', 'YYYY-MM-DD')); -- Commit the changes COMMIT;
SELECT c1.CustomerID AS DuplicateRecordID1, c2.CustomerID AS DuplicateRecordID2, c1.FirstName, c1.LastName, c1.DateOfBirth FROM Customers c1 JOIN Customers c2 ON c1.FirstName = c2.FirstName AND c1.LastName = c2.LastName AND c1.DateOfBirth = c2.DateOfBirth AND c1.CustomerID < c2.CustomerID;
Explanation:
Output:
RecordID1 | RecordID2 | FirstName | LastName | DateOfBirth |
---|---|---|---|---|
1 | 3 | John | Doe | 1990-01-01 |
1 | 5 | John | Doe | 1990-01-01 |
3 | 5 | John | Doe | 1990-01-01 |
위 내용은 SQL에서 자체 조인 | 예시를 통한 최고의 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!