수색…


소개

JOIN은 두 테이블의 정보를 결합 (결합)하는 방법입니다. 결과는 조인 유형 (아래에 설명 된 INNER / OUTER / CROSS 및 LEFT / RIGHT / FULL)과 조인 기준 (두 테이블의 행이 관련되는 방식)에 의해 정의 된 두 테이블의 열 집합을 스티칭합니다.

테이블 자체 또는 다른 테이블에 조인 될 수 있습니다. 세 개 이상의 테이블에서 정보를 액세스해야하는 경우 FROM 절에 여러 조인을 지정할 수 있습니다.

통사론

  • [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } ] JOIN

비고

이름에서 알 수 있듯이 조인은 조인 방식으로 여러 테이블의 데이터를 쿼리하는 방법으로 두 개 이상의 테이블에서 가져온 열을 표시합니다.

기본 명시 적 내부 조인

기본 조인 ( "내부 조인"이라고도 함)은 join 절에 정의 된 두 테이블의 데이터를 쿼리합니다.

다음 예제에서는 Employees 테이블에서 직원의 이름 (FName)을 선택하고 Departments 테이블에서 작업하는 부서 이름 (Name)을 선택합니다.

SELECT Employees.FName, Departments.Name
FROM   Employees
JOIN   Departments
ON Employees.DepartmentId = Departments.Id

예제 데이터베이스 에서 다음을 반환 합니다 .

Employees.FName Departments.Name
제임스 인사
남자 인사
리차드 매상

암시 적 조인

또한 여러 테이블함으로써 수행 될 수 조인 from 쉼표로 구분 절을 , 그리고 그들 사이의 관계를 형성하는 where 절. 이 기술은 암시 적 조인 (실제로는 join 절이 없기 때문에)이라고합니다.

모든 RDBMS가이를 지원하지만 구문은 대개 권고됩니다. 이 구문을 사용하는 것이 나쁜 생각 인 이유는 다음과 같습니다.

  • 특히 쿼리에 많은 조인이있는 경우 잘못된 결과를 반환하는 우발적 인 교차 조인이 발생할 수 있습니다.
  • 교차 결합을 의도했다면 구문에서 명확하지 않으며 (대신 CROSS JOIN을 쓰십시오) 누군가는 유지 보수 중이를 변경하려고합니다.

다음 예제에서는 직원의 이름과 해당 부서의 이름을 선택합니다.

SELECT e.FName, d.Name
FROM   Employee e, Departments d
WHERE  e.DeptartmentId = d.Id

예제 데이터베이스 에서 다음을 반환 합니다 .

e.FName d. 이름
제임스 인사
남자 인사
리차드 매상

왼쪽 외부 조인

왼쪽 외부 조인 (왼쪽 조인 또는 외부 조인이라고도 함)은 왼쪽 테이블의 모든 행이 표시되도록하는 조인입니다. 오른쪽 테이블에서 일치하는 행이 없으면 해당 필드는 NULL 입니다.

다음 예제는 모든 부서와 해당 부서에서 근무하는 직원의 이름을 선택합니다. 종업원이없는 부서는 여전히 결과에 반환되지만 종업원 이름에는 NULL을 갖습니다.

SELECT          Departments.Name, Employees.FName
FROM            Departments 
LEFT OUTER JOIN Employees 
ON              Departments.Id = Employees.DepartmentId

예제 데이터베이스 에서 다음을 반환 합니다 .

Departments.Name Employees.FName
인사 제임스
인사 남자
인사 조나단
매상 남자 이름
기술 없는

어떻게 작동합니까?

FROM 절에는 두 개의 테이블이 있습니다.

신분증 FName LName 전화 번호 관리자 ID DepartmentId 봉급 HireDate
1 제임스 스미스 1234567890 없는 1 1000 01-01-2002
2 남자 존슨 2468101214 1 1 400 23-03-2005
남자 이름 윌리엄스 1357911131 1 2 600 12-05-2009
4 조나단 스미스 1212121212 2 1 500 24-07-2016

신분증 이름
1 인사
2 매상
기술

먼저 중간 테이블을 제공하는 두 테이블로부터 카티 전 곱이 생성됩니다.
조인 기준 ( Departments.Id = Employees.DepartmentId )을 충족시키는 레코드는 굵게 강조 표시됩니다. 이들은 쿼리의 다음 단계로 전달됩니다.

이것은 LEFT OUTER JOIN이므로 조인의 왼쪽 측면 (Departments)에서 모든 레코드가 반환되는 반면 조인 기준과 일치하지 않으면 RIGHT 측면의 레코드에는 NULL 표식이 주어집니다. 아래 테이블에서 NULLTech 를 반환 NULL

신분증 이름 신분증 FName LName 전화 번호 관리자 ID DepartmentId 봉급 HireDate
1 인사 1 제임스 스미스 1234567890 없는 1 1000 01-01-2002
1 인사 2 남자 존슨 2468101214 1 1 400 23-03-2005
1 인사 남자 이름 윌리엄스 1357911131 1 2 600 12-05-2009
1 인사 4 조나단 스미스 1212121212 2 1 500 24-07-2016
2 매상 1 제임스 스미스 1234567890 없는 1 1000 01-01-2002
2 매상 2 남자 존슨 2468101214 1 1 400 23-03-2005
2 매상 남자 이름 윌리엄스 1357911131 1 2 600 12-05-2009
2 매상 4 조나단 스미스 1212121212 2 1 500 24-07-2016
기술 1 제임스 스미스 1234567890 없는 1 1000 01-01-2002
기술 2 남자 존슨 2468101214 1 1 400 23-03-2005
기술 남자 이름 윌리엄스 1357911131 1 2 600 12-05-2009
기술 4 조나단 스미스 1212121212 2 1 500 24-07-2016

마지막으로 SELECT 절에서 사용 된 각 표현식이 최종 테이블을 반환하도록 평가됩니다.

Departments.Name Employees.FName
인사 제임스
인사 남자
매상 리차드
기술 없는

자체 조인

테이블은 조건에 따라 서로 다른 행이 서로 일치하여 자체에 조인 될 수 있습니다. 이 경우 테이블의 두 번을 구별하기 위해 별명을 사용해야합니다.

아래 예제에서 예제 데이터베이스 인 Employees 테이블 의 각 Employee에 대해 직원의 이름과 직원의 관리자 이름을 포함하는 레코드가 반환됩니다. 관리자는 직원이기 때문에 테이블 자체에 조인됩니다.

SELECT 
    e.FName AS "Employee", 
    m.FName AS "Manager"
FROM   
    Employees e
JOIN   
    Employees m 
    ON e.ManagerId = m.Id

이 쿼리는 다음 데이터를 반환합니다.

종업원 매니저
남자 제임스
남자 이름 제임스
조나단 남자

어떻게 작동합니까?

원본 테이블에는 다음 레코드가 포함됩니다.

신분증 FName LName 전화 번호 관리자 ID DepartmentId 봉급 HireDate
1 제임스 스미스 1234567890 없는 1 1000 01-01-2002
2 남자 존슨 2468101214 1 1 400 23-03-2005
남자 이름 윌리엄스 1357911131 1 2 600 12-05-2009
4 조나단 스미스 1212121212 2 1 500 24-07-2016

첫 번째 작업은 FROM 절에 사용 된 테이블의 모든 레코드의 카디 전 곱을 만드는 것입니다. 이 경우 Employees 테이블이 두 번이므로 중간 테이블은 다음과 같습니다 (이 예제에서 사용되지 않은 필드는 모두 제거했습니다).

e.Id e.FName e.ManagerId m.Id m.FName m.ManagerId
1 제임스 없는 1 제임스 없는
1 제임스 없는 2 남자 1
1 제임스 없는 남자 이름 1
1 제임스 없는 4 조나단 2
2 남자 1 1 제임스 없는
2 남자 1 2 남자 1
2 남자 1 남자 이름 1
2 남자 1 4 조나단 2
남자 이름 1 1 제임스 없는
남자 이름 1 2 남자 1
남자 이름 1 남자 이름 1
남자 이름 1 4 조나단 2
4 조나단 2 1 제임스 없는
4 조나단 2 2 남자 1
4 조나단 2 남자 이름 1
4 조나단 2 4 조나단 2

다음 작업은 JOIN 기준을 충족하는 레코드 만 유지하므로 앨리어싱 된 e 테이블 ManagerId 가 별칭이 지정된 m 테이블과 동일한 모든 레코드 Id :

e.Id e.FName e.ManagerId m.Id m.FName m.ManagerId
2 남자 1 1 제임스 없는
남자 이름 1 1 제임스 없는
4 조나단 2 2 남자 1

그런 다음 SELECT 절에서 사용 된 각 표현식이이 테이블을 반환하도록 평가됩니다.

e.FName m.FName
남자 제임스
남자 이름 제임스
조나단 남자

마지막으로 열 이름 인 e.FNamem.FNameAS 연산자로 할당 된 별칭 열 이름으로 바뀝니다.

종업원 매니저
남자 제임스
남자 이름 제임스
조나단 남자

크로스 조인

교차 결합은 두 멤버의 데카르트 곱을 수행합니다. 데카르트 곱은 하나의 테이블의 각 행이 조인의 두 번째 테이블의 각 행과 결합됨을 의미합니다. 예를 들어 TABLEA 에 20 개의 행이 있고 TABLEB 에 20 개의 행이 있으면 결과는 20*20 = 400 출력 행이됩니다.

예제 데이터베이스 사용하기

SELECT d.Name, e.FName
FROM   Departments d
CROSS JOIN Employees e;

어느 것이 돌려 보낸다 :

d. 이름 e.FName
인사 제임스
인사 남자
인사 남자 이름
인사 조나단
매상 제임스
매상 남자
매상 남자 이름
매상 조나단
기술 제임스
기술 남자
기술 남자 이름
기술 조나단

데카르트 조인 (Cartesian Join)을 원한다면 명시 적으로 CROSS JOIN을 작성하여 원하는대로 강조하는 것이 좋습니다.

하위 쿼리에 가입

서브 u 리 결합은 하위 / 세부 사항 테이블에서 집계 데이터를 가져 와서 상위 / 헤더 테이블의 레코드와 함께 표시하려는 경우에 자주 사용됩니다. 예를 들어, 하위 레코드의 수, 하위 레코드의 숫자 열의 평균 또는 날짜 또는 숫자 필드를 기반으로하는 맨 위 또는 맨 아래 행을 가져올 수 있습니다. 이 예제에서는 여러 테이블이 관련되어있을 때 쿼리를 읽기 쉽게 만드는 별칭을 사용합니다. 다음은 상당히 전형적인 서브 쿼리 조인의 모습입니다. 이 경우 부모 테이블 Buy Orders에서 모든 행을 검색하고 하위 테이블 PurchaseOrderLineItems의 각 부모 레코드에 대한 첫 번째 행만 검색합니다.

SELECT po.Id, po.PODate, po.VendorName, po.Status, item.ItemNo, 
  item.Description, item.Cost, item.Price
FROM PurchaseOrders po
LEFT JOIN 
     (
       SELECT l.PurchaseOrderId, l.ItemNo, l.Description, l.Cost, l.Price, Min(l.id) as Id 
       FROM PurchaseOrderLineItems l
       GROUP BY l.PurchaseOrderId, l.ItemNo, l.Description, l.Cost, l.Price
     ) AS item ON item.PurchaseOrderId = po.Id

적용되는 & 합법적 인 합류 (CROSS APPLY & LATERAL JOIN)

매우 흥미로운 유형의 JOIN은 LATERAL JOIN (PostgreSQL 9.3 이상에서 새로 도입되었습니다)입니다.
이는 SQL-Server & Oracle에서 CROSS APPLY / OUTER APPLY로 알려져 있습니다.

기본 개념은 참여하는 모든 행에 테이블 반환 함수 (또는 인라인 하위 쿼리)가 적용된다는 것입니다.

이렇게하면 예를 들어 첫 번째로 일치하는 항목 만 다른 테이블에 조인 할 수 있습니다.
일반 조인과 측면 조인의 차이점은 이전에 "적용한" 하위 쿼리에서 조인 한 열을 사용할 수 있다는 것입니다.

통사론:

PostgreSQL 9.3 이상

왼쪽 | 오른쪽 | 내부 JOIN LATERAL

SQL 서버 :

교차 | 어포 적용

INNER JOIN LATERALCROSS APPLY 와 동일합니다.
LEFT JOIN LATERALOUTER APPLY 와 동일합니다.

사용 예 (PostgreSQL 9.3 이상) :

SELECT * FROM T_Contacts 

--LEFT JOIN T_MAP_Contacts_Ref_OrganisationalUnit ON MAP_CTCOU_CT_UID = T_Contacts.CT_UID AND MAP_CTCOU_SoftDeleteStatus = 1 
--WHERE T_MAP_Contacts_Ref_OrganisationalUnit.MAP_CTCOU_UID IS NULL -- 989


LEFT JOIN LATERAL 
(
    SELECT 
         --MAP_CTCOU_UID    
         MAP_CTCOU_CT_UID   
        ,MAP_CTCOU_COU_UID  
        ,MAP_CTCOU_DateFrom 
        ,MAP_CTCOU_DateTo   
   FROM T_MAP_Contacts_Ref_OrganisationalUnit 
   WHERE MAP_CTCOU_SoftDeleteStatus = 1 
   AND MAP_CTCOU_CT_UID = T_Contacts.CT_UID 

    /*  
    AND 
    ( 
        (__in_DateFrom <= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateTo) 
        AND 
        (__in_DateTo >= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateFrom) 
    ) 
    */
   ORDER BY MAP_CTCOU_DateFrom 
   LIMIT 1 
) AS FirstOE 

SQL Server의 경우

SELECT * FROM T_Contacts 

--LEFT JOIN T_MAP_Contacts_Ref_OrganisationalUnit ON MAP_CTCOU_CT_UID = T_Contacts.CT_UID AND MAP_CTCOU_SoftDeleteStatus = 1 
--WHERE T_MAP_Contacts_Ref_OrganisationalUnit.MAP_CTCOU_UID IS NULL -- 989

-- CROSS APPLY -- = INNER JOIN 
OUTER APPLY    -- = LEFT JOIN 
(
    SELECT TOP 1 
         --MAP_CTCOU_UID    
         MAP_CTCOU_CT_UID   
        ,MAP_CTCOU_COU_UID  
        ,MAP_CTCOU_DateFrom 
        ,MAP_CTCOU_DateTo   
   FROM T_MAP_Contacts_Ref_OrganisationalUnit 
   WHERE MAP_CTCOU_SoftDeleteStatus = 1 
   AND MAP_CTCOU_CT_UID = T_Contacts.CT_UID 

    /*  
    AND 
    ( 
        (@in_DateFrom <= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateTo) 
        AND 
        (@in_DateTo >= T_MAP_Contacts_Ref_OrganisationalUnit.MAP_KTKOE_DateFrom) 
    ) 
    */
   ORDER BY MAP_CTCOU_DateFrom 
) AS FirstOE 

전체 연결

덜 알려진 JOIN의 한 유형은 FULL JOIN입니다.
(참고 : FULL JOIN은 MySQL에 의해 2016 년까지 지원되지 않습니다)

FULL OUTER JOIN은 왼쪽 테이블의 모든 행과 오른쪽 테이블의 모든 행을 반환합니다.

왼쪽 테이블에서 오른쪽 테이블과 일치하는 행이 없거나 왼쪽 테이블에서 일치하지 않는 행이 오른쪽 테이블에있는 경우 해당 행도 나열됩니다.

예제 1 :

SELECT * FROM Table1

FULL JOIN Table2 
     ON 1 = 2 

예 2 :

SELECT 
     COALESCE(T_Budget.Year, tYear.Year) AS RPT_BudgetInYear 
    ,COALESCE(T_Budget.Value, 0.0) AS RPT_Value 
FROM T_Budget 

FULL JOIN tfu_RPT_All_CreateYearInterval(@budget_year_from, @budget_year_to) AS tYear 
      ON tYear.Year = T_Budget.Year 

소프트 삭제를 사용하는 경우 WHERE 절에서 소프트 삭제 상태를 다시 확인해야합니다 (FULL JOIN이 일종의 UNION처럼 동작하기 때문에).
이 작은 사실을 간과하는 것은 쉽습니다. AP_SoftDeleteStatus = 1을 join 절에 넣었 기 때문입니다.

또한 FULL JOIN을 수행하는 경우 일반적으로 WHERE 절에서 NULL을 허용해야합니다. 값에 NULL을 허용하는 것을 잊어 버리는 것은 INNER 조인과 같은 결과를 낳습니다.이 조인은 FULL JOIN을 수행하는 경우 원하지 않는 것입니다.

예:

SELECT 
     T_AccountPlan.AP_UID
    ,T_AccountPlan.AP_Code
    ,T_AccountPlan.AP_Lang_EN
    ,T_BudgetPositions.BUP_Budget
    ,T_BudgetPositions.BUP_UID 
    ,T_BudgetPositions.BUP_Jahr
FROM T_BudgetPositions    

FULL JOIN T_AccountPlan
    ON T_AccountPlan.AP_UID = T_BudgetPositions.BUP_AP_UID 
    AND T_AccountPlan.AP_SoftDeleteStatus = 1 

WHERE (1=1) 
AND (T_BudgetPositions.BUP_SoftDeleteStatus = 1 OR T_BudgetPositions.BUP_SoftDeleteStatus IS NULL) 
AND (T_AccountPlan.AP_SoftDeleteStatus = 1 OR T_AccountPlan.AP_SoftDeleteStatus IS NULL) 

재귀 JOIN

재귀 조인은 종종 부모 - 자식 데이터를 얻기 위해 사용됩니다. SQL에서는 재귀 공통 테이블 식으로 구현됩니다. 예를 들면 다음과 같습니다.

WITH RECURSIVE MyDescendants AS (
    SELECT Name
    FROM People
    WHERE Name = 'John Doe'

    UNION ALL

    SELECT People.Name
    FROM People
    JOIN MyDescendants ON People.Name = MyDescendants.Parent
)
SELECT * FROM MyDescendants;

내부 / 외부 조인의 차이점

SQL에는 결과에 일치하는 행 ( INNER JOIN , LEFT OUTER JOIN , RIGHT OUTER JOINFULL OUTER JOIN )이 포함되는지 여부를 지정하는 다양한 조인 유형이 있습니다 ( INNEROUTER 키워드는 선택 사항 임). 아래 그림은 이러한 조인 유형의 차이점을 보여줍니다. 파란색 영역은 조인에서 반환 한 결과를 나타내고 흰색 영역은 조인이 반환하지 않는 결과를 나타냅니다.

SQL 내부 / 외부 조인을 나타내는 Venn 다이어그램

SQL Pictorial Presentation에 합류 ( 참조 ) :

여기에 이미지 설명을 입력하십시오.

아래는 답변의 예입니다.

예를 들어 아래와 같은 두 개의 테이블이 있습니다.

A    B
-    -
1    3
2    4
3    5
4    6

(1,2)는 A에 고유하고, (3,4)는 공통이며, (5,6)는 B에만 고유합니다.

내부 결합

상응하는 쿼리 중 하나를 사용하는 내부 조인은 두 테이블, 즉 그들이 공통으로 가지고있는 두 개의 행의 교차를 제공합니다.

select * from a INNER JOIN b on a.a = b.b;
select a.*,b.* from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

왼쪽 외부 조인

왼쪽 외부 조인은 A의 모든 행과 B의 모든 공통 행을 제공합니다.

select * from a LEFT OUTER JOIN b on a.a = b.b;

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

오른쪽 외부 조인

비슷하게, 오른쪽 외부 조인은 B의 모든 행과 A의 모든 공통 행을 제공합니다.

select * from a RIGHT OUTER JOIN b on a.a = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

전체 외부 조인

전체 외부 조인은 A와 B의 합집합, 즉 A의 모든 행과 B의 모든 행을 제공합니다. A의 항목에 B의 해당 데이터가 없으면 B 부분은 null이고 그 반대의 경우도 마찬가지입니다.

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5

JOIN 용어 : 내부, 외부, 세미, 안티 ...

두 개의 테이블 (A와 B)과 행의 일부가 일치한다고 가정 해 봅니다 (주어진 JOIN 조건과 관련하여 특정 경우에 관계없이).

가입 용어 개요

다양한 조인 유형을 사용하여 양쪽에서 일치하거나 일치하지 않는 행을 포함하거나 제외 할 수 있으며 위 다이어그램에서 해당 용어를 선택하여 조인 이름을 올바르게 지정할 수 있습니다.

아래 예제는 다음 테스트 데이터를 사용합니다.

CREATE TABLE A (
    X varchar(255) PRIMARY KEY
);

CREATE TABLE B (
    Y varchar(255) PRIMARY KEY
);

INSERT INTO A VALUES
    ('Amy'),
    ('John'),
    ('Lisa'),
    ('Marco'),
    ('Phil');

INSERT INTO B VALUES
    ('Lisa'),
    ('Marco'),
    ('Phil'),
    ('Tim'),
    ('Vincent');

내부 결합

일치하는 왼쪽과 오른쪽 행을 결합합니다.

내부 결합

SELECT * FROM A JOIN B ON X = Y;

X      Y
------ -----
Lisa   Lisa
Marco  Marco
Phil   Phil

왼쪽 외부 조인

때로는 "왼쪽 결합"으로 축약됩니다. 일치하는 왼쪽 및 오른쪽 행을 결합하고 일치하지 않는 왼쪽 행을 포함합니다.

왼쪽 외부 조인

SELECT * FROM A LEFT JOIN B ON X = Y;

X      Y
-----  -----
Amy    NULL
John   NULL
Lisa   Lisa
Marco  Marco
Phil   Phil

오른쪽 외부 조인

때로는 "오른쪽 조인"으로 축약됩니다. 일치하는 왼쪽 및 오른쪽 행을 결합하고 일치하지 않는 오른쪽 행을 포함합니다.

오른쪽 외부 조인

SELECT * FROM A RIGHT JOIN B ON X = Y;

X      Y
-----  -------
Lisa   Lisa
Marco  Marco
Phil   Phil
NULL   Tim
NULL   Vincent

전체 외부 조인

때로는 "전체 참여"로 단축됩니다. 왼쪽 및 오른쪽 외부 조인의 조합.

전체 외부 조인

SELECT * FROM A FULL JOIN B ON X = Y;

X      Y
-----  -------
Amy    NULL
John   NULL
Lisa   Lisa
Marco  Marco
Phil   Phil
NULL   Tim
NULL   Vincent

왼쪽 세미 조인

오른쪽 행과 일치하는 왼쪽 행을 포함합니다.

왼쪽 세미 조인

SELECT * FROM A WHERE X IN (SELECT Y FROM B);

X
-----
Lisa
Marco
Phil

오른쪽 세미 조인

왼쪽 행과 일치하는 오른쪽 행을 포함합니다.

오른쪽 세미 조인

SELECT * FROM B WHERE Y IN (SELECT X FROM A);

Y
-----
Lisa
Marco
Phil

보시다시피, 왼쪽 대 오른쪽 세미 조인에 대한 전용 IN 구문이 없습니다. 우리는 SQL 텍스트 내에서 테이블 위치를 전환하여 효과를 얻습니다.


반 안티 세미 조인

오른쪽 행과 일치하지 않는 왼쪽 행을 포함합니다.

반 안티 세미 조인

SELECT * FROM A WHERE X NOT IN (SELECT Y FROM B);

X
----
Amy
John

경고 : NULL 가능 컬럼에서 NOT IN을 사용하는 경우주의하십시오! 자세한 내용은 여기 .


오른쪽 안티 세미 조인

왼쪽 행과 일치하지 않는 오른쪽 행을 포함합니다.

오른쪽 안티 세미 조인

SELECT * FROM B WHERE Y NOT IN (SELECT X FROM A);

Y
-------
Tim
Vincent

보시다시피, 왼쪽 대 오른쪽 반 조인에 대한 전용 NOT IN 구문이 없습니다. 우리는 SQL 텍스트 내의 테이블 위치를 전환하여 효과를 얻습니다.


크로스 조인

모든 오른쪽 행이있는 모든 왼쪽의 데카르트 제품.

SELECT * FROM A CROSS JOIN B;

X      Y
-----  -------
Amy    Lisa
John   Lisa
Lisa   Lisa
Marco  Lisa
Phil   Lisa
Amy    Marco
John   Marco
Lisa   Marco
Marco  Marco
Phil   Marco
Amy    Phil
John   Phil
Lisa   Phil
Marco  Phil
Phil   Phil
Amy    Tim
John   Tim
Lisa   Tim
Marco  Tim
Phil   Tim
Amy    Vincent
John   Vincent
Lisa   Vincent
Marco  Vincent
Phil   Vincent

크로스 조인은 항상 일치하는 조인 조건을 가진 내부 조인과 동일하므로 다음 쿼리는 동일한 결과를 반환합니다.

SELECT * FROM A JOIN B ON 1 = 1;

자기 조인

이것은 단순히 자신과 조인하는 테이블을 나타냅니다. 자체 조인은 위에 논의 된 조인 유형 중 하나 일 수 있습니다. 예를 들어, 이것은 내부 자체 조인입니다.

SELECT * FROM A A1 JOIN A A2 ON LEN(A1.X) < LEN(A2.X);

X     X
----  -----
Amy   John
Amy   Lisa
Amy   Marco
John  Marco
Lisa  Marco
Phil  Marco
Amy   Phil


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow