SnowConvert: Oracle 합류

조인은 둘 이상의 테이블, 뷰 또는 구체화된 뷰의 행을 결합하는 쿼리입니다. Oracle 데이터베이스는 쿼리의 FROM 절에 여러 테이블이 나타날 때마다 조인 성능을 수행합니다. (Oracle SQL Language Reference JOINS)

이 섹션의 문서는 다음과 같습니다.

equijoin.md

band-join.md

self-join.md

cartesian-products.md

inner-join.md

outer-join.md

semijoin.md

안티 조인

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

설명

안티 조인은 조건자의 오른쪽에 해당하는 행이 없는 경우 조건자의 왼쪽에서 행을 반환합니다. 오른쪽의 하위 쿼리와 일치하지 않는 행을 반환합니다(NOT IN). 하위 쿼리가 WHERE 절의 OR 분기에 있는 경우 안티 조인 변환을 수행할 수 없습니다. (Oracle SQL Language Reference 안티 조인).

이런 종류의 _Join_에 대해서는 특별한 변환이 수행되지 않는데, Snowflake는 동일한 구문을 지원하기 때문입니다.

샘플 소스 패턴

참고

결과 순서가 Oracle과 Snowflake에 따라 다를 수 있으므로 _Order by clause_이 추가되었습니다.

참고

결과 세트가 너무 커서 _Row Limiting Clause_가 추가되었습니다. 이를 제거하면 전체 결과 세트를 검색할 수 있습니다.

참고

샘플 데이터베이스를 설정하려면 이 섹션을 확인하십시오.

Where Not In

Oracle
 SELECT e.employee_id, e.first_name, e.last_name FROM hr.employees e
WHERE e.department_id NOT IN

    (SELECT h.department_id FROM hr.departments h WHERE location_id = 1700)
    
ORDER BY e.last_name
FETCH FIRST 10 ROWS ONLY;
Copy
EMPLOYEE_ID|FIRST_NAME|LAST_NAME|
-----------+----------+---------+
        174|Ellen     |Abel     |
        166|Sundar    |Ande     |
        130|Mozhe     |Atkinson |
        105|David     |Austin   |
        204|Hermann   |Baer     |
        167|Amit      |Banda    |
        172|Elizabeth |Bates    |
        192|Sarah     |Bell     |
        151|David     |Bernstein|
        129|Laura     |Bissot   |

Copy
Snowflake
 SELECT e.employee_id, e.first_name, e.last_name FROM
    hr.employees e
WHERE e.department_id NOT IN
        !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!!
    (SELECT h.department_id FROM
            hr.departments h WHERE location_id = 1700)

ORDER BY e.last_name
    FETCH FIRST 10 ROWS ONLY;
Copy
EMPLOYEE_ID|FIRST_NAME|LAST_NAME|
-----------+----------+---------+
        174|Ellen     |Abel     |
        166|Sundar    |Ande     |
        130|Mozhe     |Atkinson |
        105|David     |Austin   |
        204|Hermann   |Baer     |
        167|Amit      |Banda    |
        172|Elizabeth |Bates    |
        192|Sarah     |Bell     |
        151|David     |Bernstein|
        129|Laura     |Bissot   |

Copy

Where Not Exists

Oracle
 SELECT   d.department_id, d.department_name
FROM     hr.departments d
WHERE    NOT EXISTS
         
         (SELECT 1 FROM hr.employees E WHERE
         e.department_id = d.department_id)
         
ORDER BY d.department_id
FETCH FIRST 10 ROWS ONLY;
Copy
DEPARTMENT_ID|DEPARTMENT_NAME     |
-------------+--------------------+
          120|Treasury            |
          130|Corporate Tax       |
          140|Control And Credit  |
          150|Shareholder Services|
          160|Benefits            |
          170|Manufacturing       |
          180|Construction        |
          190|Contracting         |
          200|Operations          |
          210|IT Support          |

Copy
Snowflake
 SELECT   d.department_id, d.department_name
FROM
         hr.departments d
WHERE    NOT EXISTS
                  !!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!!
         (SELECT 1 FROM
                           hr.employees E WHERE
         e.department_id = d.department_id)

ORDER BY d.department_id
         FETCH FIRST 10 ROWS ONLY;
Copy
DEPARTMENT_ID|DEPARTMENT_NAME     |
-------------+--------------------+
          120|Treasury            |
          130|Corporate Tax       |
          140|Control And Credit  |
          150|Shareholder Services|
          160|Benefits            |
          170|Manufacturing       |
          180|Construction        |
          190|Contracting         |
          200|Operations          |
          210|IT Support          |

Copy

알려진 문제

1. Results ordering mismatch between languages

쿼리 결과는 두 데이터베이스 엔진에서 동일한 내용을 갖지만 쿼리에 Order By 절이 정의되지 않은 경우 순서가 다를 수 있습니다.

밴드 조인

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

설명

밴드 조인 은 한 데이터 세트의 키 값이 두 번째 데이터 세트의 지정된 범위(“밴드”)에 속해야 하는 특수한 유형의 논키조인입니다. 동일한 테이블이 첫 번째 및 두 번째 데이터 세트로 사용될 수 있습니다. (Oracle SQL Language Reference BandJoin)

이 섹션에서는 Snowflake에서 밴드 조인이 실행되는 방식과 실행 계획이 개선된 버전의 Oracle과 매우 유사하다는 점을 살펴봅니다.

샘플 소스 패턴

참고

주문 기준_ 절이 추가되었는데, 이는 Oracle과 Snowflake의 결과 순서가 다를 수 있기 때문입니다.

참고

결과 세트가 너무 커서 _Row Limiting Clause_가 추가되었습니다. 이를 제거하면 전체 결과 세트를 검색할 수 있습니다.

참고

샘플 데이터베이스를 설정하려면 이 섹션을 확인하십시오.

경고

Create Table 없이 이 코드를 마이그레이션하면 변환기가 열의 의미 체계 정보를 로딩할 수 없으며 산술 작업에 경고가 표시됩니다.

기본 밴드 조인 사례

Oracle
 SELECT  e1.last_name || 
        ' has salary between 100 less and 100 more than ' || 
        e2.last_name AS "SALARY COMPARISON"
FROM    employees e1, 
        employees e2
WHERE   e1.salary 
BETWEEN e2.salary - 100 
AND     e2.salary + 100
ORDER BY "SALARY COMPARISON"
FETCH FIRST 10 ROWS ONLY
Copy
SALARY COMPARISON                                              |
---------------------------------------------------------------+
Abel has salary between 100 less and 100 more than Abel        |
Abel has salary between 100 less and 100 more than Cambrault   |
Abel has salary between 100 less and 100 more than Raphaely    |
Ande has salary between 100 less and 100 more than Ande        |
Ande has salary between 100 less and 100 more than Mavris      |
Ande has salary between 100 less and 100 more than Vollman     |
Atkinson has salary between 100 less and 100 more than Atkinson|
Atkinson has salary between 100 less and 100 more than Baida   |
Atkinson has salary between 100 less and 100 more than Gates   |
Atkinson has salary between 100 less and 100 more than Geoni   |

Copy
Snowflake
 SELECT
                NVL(  e1.last_name :: STRING, '') ||
                ' has salary between 100 less and 100 more than ' || NVL(
                e2.last_name :: STRING, '') AS "SALARY COMPARISON"
FROM
                employees e1,
                employees e2
WHERE   e1.salary
BETWEEN
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '-' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!! e2.salary - 100
AND
        !!!RESOLVE EWI!!! /*** SSC-EWI-OR0036 - TYPES RESOLUTION ISSUES, ARITHMETIC OPERATION '+' MAY NOT BEHAVE CORRECTLY BETWEEN unknown AND Number ***/!!!     e2.salary + 100
ORDER BY "SALARY COMPARISON"
FETCH FIRST 10 ROWS ONLY;
Copy
SALARY COMPARISON                                              |
---------------------------------------------------------------+
Abel has salary between 100 less and 100 more than Abel        |
Abel has salary between 100 less and 100 more than Cambrault   |
Abel has salary between 100 less and 100 more than Raphaely    |
Ande has salary between 100 less and 100 more than Ande        |
Ande has salary between 100 less and 100 more than Mavris      |
Ande has salary between 100 less and 100 more than Vollman     |
Atkinson has salary between 100 less and 100 more than Atkinson|
Atkinson has salary between 100 less and 100 more than Baida   |
Atkinson has salary between 100 less and 100 more than Gates   |
Atkinson has salary between 100 less and 100 more than Geoni   |

Copy

경고

해당 테이블 없이 일부 SELECT 문을 마이그레이션하면 SSC-EWI-OR0036 발생 가능: 유형 확인 문제. 이 경고를 피하려면 파일 내에 CREATE TABLE 을 포함하십시오.

결과는 BAND JOIN 함수가 동일하게 작동합니다.

실행 계획

추가 정보로, 밴드 조인의 특별한 점은 실행 계획입니다.

다음 이미지는 테스트 쿼리에 대한 개선된 실행 계획 (Oracle 12c부터 구현됨)을 보여줍니다.

그리고 다음 이미지에서 Snowflake의 실행 계획을 볼 수 있습니다.

참고

Snowflake의 실행 계획은 Oracle의 최적화된 버전과 매우 유사합니다. 쿼리의 최종 기간과 성능은 다른 많은 요소의 영향을 받으며 각 DBMS 내부 기능에 전적으로 종속됩니다.

Known Issues

1. Results ordering mismatch between languages

쿼리 결과는 두 데이터베이스 엔진에서 동일한 내용을 갖지만 쿼리에 Order By 절이 정의되지 않은 경우 순서가 다를 수 있습니다.

관련 EWIs

  • SSC-EWI-OR0036: 유형 확인 문제, 문자열과 날짜 간에 산술 연산이 제대로 동작하지 않을 수 있습니다.

데카르트 곱

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

데이터베이스 쿼리의 두 테이블에 조인 조건이 없는 경우 Oracle 데이터베이스는 해당 데카르트 곱을 반환합니다. Oracle은 한 테이블의 각 행을 다른 테이블의 각 행과 결합합니다. (Oracle SQL Reference 데카르트 곱 하위 섹션)

Oracle 및 Snowflake는 데카르트 곱과 동일한 동작을 하는 ANSI 교차 조인 구문과도 호환됩니다.

이런 종류의 _Join_에 대해서는 특별한 변환이 수행되지 않는데, Snowflake는 동일한 구문을 지원하기 때문입니다.

샘플 소스 패턴

참고

결과 순서가 Oracle과 Snowflake에 따라 다를 수 있으므로 _Order by clause_이 추가되었습니다.

참고

결과 세트가 너무 커서 _Row Limiting Clause_가 추가되었습니다. 이를 제거하면 전체 결과 세트를 검색할 수 있습니다.

참고

샘플 데이터베이스를 설정하려면 이 섹션을 확인하십시오.

암시적 구문

Oracle
 -- Resulting rows
SELECT * FROM hr.employees, hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;

-- Resulting total rows
SELECT COUNT(*) FROM hr.employees, hr.departments;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |PHONE_NUMBER|HIRE_DATE              |JOB_ID|SALARY|COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|------|------------|-----------------------|------|------|--------------|----------|-------------|-------------|---------------|----------|-----------|
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |10           |Administration |200       |1700       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |50           |Shipping       |121       |1500       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |40           |Human Resources|203       |2400       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |30           |Purchasing     |114       |1700       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |20           |Marketing      |201       |1800       |


Copy
|COUNT(*)|
|--------|
|2889    |


Copy
Snowflake
 -- Resulting rows
SELECT * FROM
hr.employees,
hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;

-- Resulting total rows
SELECT COUNT(*) FROM
hr.employees,
hr.departments;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |PHONE_NUMBER|HIRE_DATE |JOB_ID|SALARY |COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|------|------------|----------|------|-------|--------------|----------|-------------|-------------|---------------|----------|-----------|
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10|ST_MAN|8200.00|              |100       |50           |40           |Human Resources|203       |2400       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10|ST_MAN|8200.00|              |100       |50           |20           |Marketing      |201       |1800       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10|ST_MAN|8200.00|              |100       |50           |10           |Administration |200       |1700       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10|ST_MAN|8200.00|              |100       |50           |50           |Shipping       |121       |1500       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10|ST_MAN|8200.00|              |100       |50           |30           |Purchasing     |114       |1700       |


Copy
|COUNT(*)|
|--------|
|2889    |


Copy

교차 조인 구문

Oracle
 -- Resulting rows
SELECT * FROM hr.employees CROSS join hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;

-- Resulting total rows
SELECT COUNT(*) FROM hr.employees CROSS join hr.departments;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL |PHONE_NUMBER|HIRE_DATE              |JOB_ID|SALARY|COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|------|------------|-----------------------|------|------|--------------|----------|-------------|-------------|---------------|----------|-----------|
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |10           |Administration |200       |1700       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |50           |Shipping       |121       |1500       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |40           |Human Resources|203       |2400       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |30           |Purchasing     |114       |1700       |
|121        |Adam      |Fripp    |AFRIPP|650.123.2234|2005-04-10 00:00:00.000|ST_MAN|8200  |              |100       |50           |20           |Marketing      |201       |1800       |


Copy
|COUNT(*)|
|--------|
|2889    |


Copy
Snowflake
-- Resulting rows
SELECT * FROM
hr.employees
CROSS join hr.departments
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY;

-- Resulting total rows
SELECT COUNT(*) FROM
hr.employees
CROSS join hr.departments;
Copy

알려진 문제

1. Results ordering mismatch between languages

쿼리 결과는 두 데이터베이스 엔진에서 동일한 내용을 갖지만 쿼리에 Order By 절이 정의되지 않은 경우 순서가 다를 수 있습니다.

관련 EWIs

관련 EWIs 없음.

등가 조인

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

설명

등가 조인은 동등 연산자가 포함된 조인 조건이 있는 조인의 암시적 형태입니다. Oracle 등가 조인에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.

이런 종류의 _Join_에 대해서는 특별한 변환이 수행되지 않는데, Snowflake는 동일한 구문을 지원하기 때문입니다.

샘플 소스 패턴

참고

결과 순서가 Oracle과 Snowflake에 따라 다를 수 있으므로 _Order by clause_이 추가되었습니다.

참고

결과 세트가 너무 크기 때문에 _Row Limiting Clause_이 추가되었습니다. 이를 제거하면 전체 결과 세트를 검색할 수 있습니다.

참고

샘플 데이터베이스를 설정하려면 이 섹션을 확인하십시오.

기본 Equijoin 케이스

Oracle
 SELECT last_name, job_id, hr.departments.department_id, department_name
FROM hr.employees, hr.departments
WHERE hr.employees.department_id = hr.departments.department_id
ORDER BY last_name
FETCH FIRST 5 ROWS ONLY;
Copy
|LAST_NAME|JOB_ID  |DEPARTMENT_ID|DEPARTMENT_NAME |
|---------|--------|-------------|----------------|
|Abel     |SA_REP  |80           |Sales           |
|Ande     |SA_REP  |80           |Sales           |
|Atkinson |ST_CLERK|50           |Shipping        |
|Austin   |IT_PROG |60           |IT              |
|Baer     |PR_REP  |70           |Public Relations|


Copy
Snowflake
 SELECT last_name, job_id, hr.departments.department_id, department_name
FROM
hr.employees,
hr.departments
WHERE hr.employees.department_id = hr.departments.department_id
ORDER BY last_name
FETCH FIRST 5 ROWS ONLY;
Copy
|LAST_NAME|JOB_ID  |DEPARTMENT_ID|DEPARTMENT_NAME |
|---------|--------|-------------|----------------|
|Abel     |SA_REP  |80           |Sales           |
|Ande     |SA_REP  |80           |Sales           |
|Atkinson |ST_CLERK|50           |Shipping        |
|Austin   |IT_PROG |60           |IT              |
|Baer     |PR_REP  |70           |Public Relations|


Copy

알려진 문제

1. Results ordering mismatch between languages

쿼리 결과는 두 데이터베이스 엔진에서 동일한 내용을 갖지만 쿼리에 Order By 절이 정의되지 않은 경우 순서가 다를 수 있습니다.

관련 EWIs

관련 EWIs 없음.

내부 조인

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

설명

내부 조인(단순 조인이라고도 함)은 조인 조건을 충족하는 행만 반환하는 2개 이상의 테이블에 대한 조인입니다. (Oracle SQL 내부 조인 하위 섹션).

{ [ INNER ] JOIN table_reference
 { ON condition
 | USING (column [, column ]...)
 }
| { CROSS
 | NATURAL [ INNER ]
 }
 JOIN table_reference
}

Copy

샘플 소스 패턴

참고

주문 기준_ 절이 추가되었는데, 이는 Oracle과 Snowflake의 결과 순서가 다를 수 있기 때문입니다.

참고

결과 세트가 너무 커서 _Row Limiting Clause_가 추가되었습니다. 이 절을 제거하면 전체 결과 세트를 검색할 수 있습니다.

참고

샘플 데이터베이스를 설정하려면 이 섹션을 확인하십시오.

기본 내부 조인

내부 조인 절에서 “INNER”는 선택적 키워드이며, 다음 쿼리에는 동일한 데이터 세트를 검색하는 2개의 선택 항목이 있습니다.

Oracle
 SELECT 
    *
FROM 
    hr.employees
INNER JOIN hr.departments ON
    hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;

SELECT 
    *
FROM 
    hr.employees
JOIN hr.departments ON
    hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE              |JOB_ID    |SALARY|COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|--------|------------|-----------------------|----------|------|--------------|----------|-------------|-------------|---------------|----------|-----------|
|100        |Steven    |King     |SKING   |515.123.4567|2003-06-17 00:00:00.000|AD_PRES   |24000 |              |          |90           |90           |Executive      |100       |1700       |
|101        |Neena     |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21 00:00:00.000|AD_VP     |17000 |              |100       |90           |90           |Executive      |100       |1700       |
|102        |Lex       |De Haan  |LDEHAAN |515.123.4569|2001-01-13 00:00:00.000|AD_VP     |17000 |              |100       |90           |90           |Executive      |100       |1700       |
|103        |Alexander |Hunold   |AHUNOLD |590.423.4567|2006-01-03 00:00:00.000|IT_PROG   |9000  |              |102       |60           |60           |IT             |103       |1400       |
|104        |Bruce     |Ernst    |BERNST  |590.423.4568|2007-05-21 00:00:00.000|IT_PROG   |6000  |              |103       |60           |60           |IT             |103       |1400       |
|105        |David     |Austin   |DAUSTIN |590.423.4569|2005-06-25 00:00:00.000|IT_PROG   |4800  |              |103       |60           |60           |IT             |103       |1400       |
|106        |Valli     |Pataballa|VPATABAL|590.423.4560|2006-02-05 00:00:00.000|IT_PROG   |4800  |              |103       |60           |60           |IT             |103       |1400       |
|107        |Diana     |Lorentz  |DLORENTZ|590.423.5567|2007-02-07 00:00:00.000|IT_PROG   |4200  |              |103       |60           |60           |IT             |103       |1400       |
|108        |Nancy     |Greenberg|NGREENBE|515.124.4569|2002-08-17 00:00:00.000|FI_MGR    |12008 |              |101       |100          |100          |Finance        |108       |1700       |
|109        |Daniel    |Faviet   |DFAVIET |515.124.4169|2002-08-16 00:00:00.000|FI_ACCOUNT|9000  |              |108       |100          |100          |Finance        |108       |1700       |


Copy
Snowflake
 SELECT
    *
FROM
hr.employees
INNER JOIN
    hr.departments
    ON
    hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;

SELECT
    *
FROM
    hr.employees
JOIN
    hr.departments
    ON
    hr.departments.department_id = hr.employees.department_id
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE |JOB_ID    |SALARY  |COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|--------|------------|----------|----------|--------|--------------|----------|-------------|-------------|---------------|----------|-----------|
|100        |Steven    |King     |SKING   |515.123.4567|2003-06-17|AD_PRES   |24000.00|              |          |90           |90           |Executive      |100       |1700       |
|101        |Neena     |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21|AD_VP     |17000.00|              |100       |90           |90           |Executive      |100       |1700       |
|102        |Lex       |De Haan  |LDEHAAN |515.123.4569|2001-01-13|AD_VP     |17000.00|              |100       |90           |90           |Executive      |100       |1700       |
|103        |Alexander |Hunold   |AHUNOLD |590.423.4567|2006-01-03|IT_PROG   |9000.00 |              |102       |60           |60           |IT             |103       |1400       |
|104        |Bruce     |Ernst    |BERNST  |590.423.4568|2007-05-21|IT_PROG   |6000.00 |              |103       |60           |60           |IT             |103       |1400       |
|105        |David     |Austin   |DAUSTIN |590.423.4569|2005-06-25|IT_PROG   |4800.00 |              |103       |60           |60           |IT             |103       |1400       |
|106        |Valli     |Pataballa|VPATABAL|590.423.4560|2006-02-05|IT_PROG   |4800.00 |              |103       |60           |60           |IT             |103       |1400       |
|107        |Diana     |Lorentz  |DLORENTZ|590.423.5567|2007-02-07|IT_PROG   |4200.00 |              |103       |60           |60           |IT             |103       |1400       |
|108        |Nancy     |Greenberg|NGREENBE|515.124.4569|2002-08-17|FI_MGR    |12008.00|              |101       |100          |100          |Finance        |108       |1700       |
|109        |Daniel    |Faviet   |DFAVIET |515.124.4169|2002-08-16|FI_ACCOUNT|9000.00 |              |108       |100          |100          |Finance        |108       |1700       |


Copy

절을 사용하여 내부 조인하기

Oracle
 SELECT 
    *
FROM 
    hr.employees
INNER JOIN hr.departments
    USING(department_id)
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE              |JOB_ID    |SALARY|COMMISSION_PCT|MANAGER_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-------------|-----------|----------|---------|--------|------------|-----------------------|----------|------|--------------|----------|---------------|----------|-----------|
|90           |100        |Steven    |King     |SKING   |515.123.4567|2003-06-17 00:00:00.000|AD_PRES   |24000 |              |          |Executive      |100       |1700       |
|90           |101        |Neena     |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21 00:00:00.000|AD_VP     |17000 |              |100       |Executive      |100       |1700       |
|90           |102        |Lex       |De Haan  |LDEHAAN |515.123.4569|2001-01-13 00:00:00.000|AD_VP     |17000 |              |100       |Executive      |100       |1700       |
|60           |103        |Alexander |Hunold   |AHUNOLD |590.423.4567|2006-01-03 00:00:00.000|IT_PROG   |9000  |              |102       |IT             |103       |1400       |
|60           |104        |Bruce     |Ernst    |BERNST  |590.423.4568|2007-05-21 00:00:00.000|IT_PROG   |6000  |              |103       |IT             |103       |1400       |
|60           |105        |David     |Austin   |DAUSTIN |590.423.4569|2005-06-25 00:00:00.000|IT_PROG   |4800  |              |103       |IT             |103       |1400       |
|60           |106        |Valli     |Pataballa|VPATABAL|590.423.4560|2006-02-05 00:00:00.000|IT_PROG   |4800  |              |103       |IT             |103       |1400       |
|60           |107        |Diana     |Lorentz  |DLORENTZ|590.423.5567|2007-02-07 00:00:00.000|IT_PROG   |4200  |              |103       |IT             |103       |1400       |
|100          |108        |Nancy     |Greenberg|NGREENBE|515.124.4569|2002-08-17 00:00:00.000|FI_MGR    |12008 |              |101       |Finance        |108       |1700       |
|100          |109        |Daniel    |Faviet   |DFAVIET |515.124.4169|2002-08-16 00:00:00.000|FI_ACCOUNT|9000  |              |108       |Finance        |108       |1700       |


Copy
Snowflake
 SELECT
    *
FROM
hr.employees
INNER JOIN
    hr.departments
    USING(department_id)
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE |JOB_ID    |SALARY  |COMMISSION_PCT|MANAGER_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-------------|-----------|----------|---------|--------|------------|----------|----------|--------|--------------|----------|---------------|----------|-----------|
|90           |100        |Steven    |King     |SKING   |515.123.4567|2003-06-17|AD_PRES   |24000.00|              |          |Executive      |100       |1700       |
|90           |101        |Neena     |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21|AD_VP     |17000.00|              |100       |Executive      |100       |1700       |
|90           |102        |Lex       |De Haan  |LDEHAAN |515.123.4569|2001-01-13|AD_VP     |17000.00|              |100       |Executive      |100       |1700       |
|60           |103        |Alexander |Hunold   |AHUNOLD |590.423.4567|2006-01-03|IT_PROG   |9000.00 |              |102       |IT             |103       |1400       |
|60           |104        |Bruce     |Ernst    |BERNST  |590.423.4568|2007-05-21|IT_PROG   |6000.00 |              |103       |IT             |103       |1400       |
|60           |105        |David     |Austin   |DAUSTIN |590.423.4569|2005-06-25|IT_PROG   |4800.00 |              |103       |IT             |103       |1400       |
|60           |106        |Valli     |Pataballa|VPATABAL|590.423.4560|2006-02-05|IT_PROG   |4800.00 |              |103       |IT             |103       |1400       |
|60           |107        |Diana     |Lorentz  |DLORENTZ|590.423.5567|2007-02-07|IT_PROG   |4200.00 |              |103       |IT             |103       |1400       |
|100          |108        |Nancy     |Greenberg|NGREENBE|515.124.4569|2002-08-17|FI_MGR    |12008.00|              |101       |Finance        |108       |1700       |
|100          |109        |Daniel    |Faviet   |DFAVIET |515.124.4169|2002-08-16|FI_ACCOUNT|9000.00 |              |108       |Finance        |108       |1700       |


Copy

교차 내부 조인

Oracle
 SELECT 
    *
FROM 
    hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE              |JOB_ID    |SALARY|COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|--------|------------|-----------------------|----------|------|--------------|----------|-------------|-------------|---------------|----------|-----------|
|100        |Steven    |King     |SKING   |515.123.4567|2003-06-17 00:00:00.000|AD_PRES   |24000 |              |          |90           |110          |Accounting     |205       |1700       |
|101        |Neena     |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21 00:00:00.000|AD_VP     |17000 |              |100       |90           |110          |Accounting     |205       |1700       |
|102        |Lex       |De Haan  |LDEHAAN |515.123.4569|2001-01-13 00:00:00.000|AD_VP     |17000 |              |100       |90           |110          |Accounting     |205       |1700       |
|103        |Alexander |Hunold   |AHUNOLD |590.423.4567|2006-01-03 00:00:00.000|IT_PROG   |9000  |              |102       |60           |110          |Accounting     |205       |1700       |
|104        |Bruce     |Ernst    |BERNST  |590.423.4568|2007-05-21 00:00:00.000|IT_PROG   |6000  |              |103       |60           |110          |Accounting     |205       |1700       |
|105        |David     |Austin   |DAUSTIN |590.423.4569|2005-06-25 00:00:00.000|IT_PROG   |4800  |              |103       |60           |110          |Accounting     |205       |1700       |
|106        |Valli     |Pataballa|VPATABAL|590.423.4560|2006-02-05 00:00:00.000|IT_PROG   |4800  |              |103       |60           |110          |Accounting     |205       |1700       |
|107        |Diana     |Lorentz  |DLORENTZ|590.423.5567|2007-02-07 00:00:00.000|IT_PROG   |4200  |              |103       |60           |110          |Accounting     |205       |1700       |
|108        |Nancy     |Greenberg|NGREENBE|515.124.4569|2002-08-17 00:00:00.000|FI_MGR    |12008 |              |101       |100          |110          |Accounting     |205       |1700       |
|109        |Daniel    |Faviet   |DFAVIET |515.124.4169|2002-08-16 00:00:00.000|FI_ACCOUNT|9000  |              |108       |100          |110          |Accounting     |205       |1700       |


Copy
Snowflake
 SELECT
    *
FROM
hr.employees
CROSS JOIN hr.departments
ORDER BY department_name, employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE |JOB_ID    |SALARY  |COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME|MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|--------|------------|----------|----------|--------|--------------|----------|-------------|-------------|---------------|----------|-----------|
|100        |Steven    |King     |SKING   |515.123.4567|2003-06-17|AD_PRES   |24000.00|              |          |90           |110          |Accounting     |205       |1700       |
|101        |Neena     |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21|AD_VP     |17000.00|              |100       |90           |110          |Accounting     |205       |1700       |
|102        |Lex       |De Haan  |LDEHAAN |515.123.4569|2001-01-13|AD_VP     |17000.00|              |100       |90           |110          |Accounting     |205       |1700       |
|103        |Alexander |Hunold   |AHUNOLD |590.423.4567|2006-01-03|IT_PROG   |9000.00 |              |102       |60           |110          |Accounting     |205       |1700       |
|104        |Bruce     |Ernst    |BERNST  |590.423.4568|2007-05-21|IT_PROG   |6000.00 |              |103       |60           |110          |Accounting     |205       |1700       |
|105        |David     |Austin   |DAUSTIN |590.423.4569|2005-06-25|IT_PROG   |4800.00 |              |103       |60           |110          |Accounting     |205       |1700       |
|106        |Valli     |Pataballa|VPATABAL|590.423.4560|2006-02-05|IT_PROG   |4800.00 |              |103       |60           |110          |Accounting     |205       |1700       |
|107        |Diana     |Lorentz  |DLORENTZ|590.423.5567|2007-02-07|IT_PROG   |4200.00 |              |103       |60           |110          |Accounting     |205       |1700       |
|108        |Nancy     |Greenberg|NGREENBE|515.124.4569|2002-08-17|FI_MGR    |12008.00|              |101       |100          |110          |Accounting     |205       |1700       |
|109        |Daniel    |Faviet   |DFAVIET |515.124.4169|2002-08-16|FI_ACCOUNT|9000.00 |              |108       |100          |110          |Accounting     |205       |1700       |


Copy

자연 내부 조인

Oracle
 SELECT 
    *
FROM 
    hr.employees
NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|MANAGER_ID|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME |LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE              |JOB_ID    |SALARY|COMMISSION_PCT|DEPARTMENT_NAME|LOCATION_ID|
|----------|-------------|-----------|-----------|---------|--------|------------|-----------------------|----------|------|--------------|---------------|-----------|
|100       |90           |101        |Neena      |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21 00:00:00.000|AD_VP     |17000 |              |Executive      |1700       |
|100       |90           |102        |Lex        |De Haan  |LDEHAAN |515.123.4569|2001-01-13 00:00:00.000|AD_VP     |17000 |              |Executive      |1700       |
|103       |60           |104        |Bruce      |Ernst    |BERNST  |590.423.4568|2007-05-21 00:00:00.000|IT_PROG   |6000  |              |IT             |1400       |
|103       |60           |105        |David      |Austin   |DAUSTIN |590.423.4569|2005-06-25 00:00:00.000|IT_PROG   |4800  |              |IT             |1400       |
|103       |60           |106        |Valli      |Pataballa|VPATABAL|590.423.4560|2006-02-05 00:00:00.000|IT_PROG   |4800  |              |IT             |1400       |
|103       |60           |107        |Diana      |Lorentz  |DLORENTZ|590.423.5567|2007-02-07 00:00:00.000|IT_PROG   |4200  |              |IT             |1400       |
|108       |100          |109        |Daniel     |Faviet   |DFAVIET |515.124.4169|2002-08-16 00:00:00.000|FI_ACCOUNT|9000  |              |Finance        |1700       |
|108       |100          |110        |John       |Chen     |JCHEN   |515.124.4269|2005-09-28 00:00:00.000|FI_ACCOUNT|8200  |              |Finance        |1700       |
|108       |100          |111        |Ismael     |Sciarra  |ISCIARRA|515.124.4369|2005-09-30 00:00:00.000|FI_ACCOUNT|7700  |              |Finance        |1700       |
|108       |100          |112        |Jose Manuel|Urman    |JMURMAN |515.124.4469|2006-03-07 00:00:00.000|FI_ACCOUNT|7800  |              |Finance        |1700       |


Copy
Snowflake
 SELECT
    *
FROM
hr.employees
NATURAL JOIN
    hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|MANAGER_ID|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME |LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE |JOB_ID    |SALARY  |COMMISSION_PCT|DEPARTMENT_NAME|LOCATION_ID|
|----------|-------------|-----------|-----------|---------|--------|------------|----------|----------|--------|--------------|---------------|-----------|
|100       |90           |101        |Neena      |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21|AD_VP     |17000.00|              |Executive      |1700       |
|100       |90           |102        |Lex        |De Haan  |LDEHAAN |515.123.4569|2001-01-13|AD_VP     |17000.00|              |Executive      |1700       |
|103       |60           |104        |Bruce      |Ernst    |BERNST  |590.423.4568|2007-05-21|IT_PROG   |6000.00 |              |IT             |1400       |
|103       |60           |105        |David      |Austin   |DAUSTIN |590.423.4569|2005-06-25|IT_PROG   |4800.00 |              |IT             |1400       |
|103       |60           |106        |Valli      |Pataballa|VPATABAL|590.423.4560|2006-02-05|IT_PROG   |4800.00 |              |IT             |1400       |
|103       |60           |107        |Diana      |Lorentz  |DLORENTZ|590.423.5567|2007-02-07|IT_PROG   |4200.00 |              |IT             |1400       |
|108       |100          |109        |Daniel     |Faviet   |DFAVIET |515.124.4169|2002-08-16|FI_ACCOUNT|9000.00 |              |Finance        |1700       |
|108       |100          |110        |John       |Chen     |JCHEN   |515.124.4269|2005-09-28|FI_ACCOUNT|8200.00 |              |Finance        |1700       |
|108       |100          |111        |Ismael     |Sciarra  |ISCIARRA|515.124.4369|2005-09-30|FI_ACCOUNT|7700.00 |              |Finance        |1700       |
|108       |100          |112        |Jose Manuel|Urman    |JMURMAN |515.124.4469|2006-03-07|FI_ACCOUNT|7800.00 |              |Finance        |1700       |


Copy

교차 자연 조인

Oracle
 SELECT 
    *
FROM 
    hr.employees
CROSS NATURAL JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|MANAGER_ID|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME |LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE              |JOB_ID    |SALARY|COMMISSION_PCT|DEPARTMENT_NAME|LOCATION_ID|
|----------|-------------|-----------|-----------|---------|--------|------------|-----------------------|----------|------|--------------|---------------|-----------|
|100       |90           |101        |Neena      |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21 00:00:00.000|AD_VP     |17000 |              |Executive      |1700       |
|100       |90           |102        |Lex        |De Haan  |LDEHAAN |515.123.4569|2001-01-13 00:00:00.000|AD_VP     |17000 |              |Executive      |1700       |
|103       |60           |104        |Bruce      |Ernst    |BERNST  |590.423.4568|2007-05-21 00:00:00.000|IT_PROG   |6000  |              |IT             |1400       |
|103       |60           |105        |David      |Austin   |DAUSTIN |590.423.4569|2005-06-25 00:00:00.000|IT_PROG   |4800  |              |IT             |1400       |
|103       |60           |106        |Valli      |Pataballa|VPATABAL|590.423.4560|2006-02-05 00:00:00.000|IT_PROG   |4800  |              |IT             |1400       |
|103       |60           |107        |Diana      |Lorentz  |DLORENTZ|590.423.5567|2007-02-07 00:00:00.000|IT_PROG   |4200  |              |IT             |1400       |
|108       |100          |109        |Daniel     |Faviet   |DFAVIET |515.124.4169|2002-08-16 00:00:00.000|FI_ACCOUNT|9000  |              |Finance        |1700       |
|108       |100          |110        |John       |Chen     |JCHEN   |515.124.4269|2005-09-28 00:00:00.000|FI_ACCOUNT|8200  |              |Finance        |1700       |
|108       |100          |111        |Ismael     |Sciarra  |ISCIARRA|515.124.4369|2005-09-30 00:00:00.000|FI_ACCOUNT|7700  |              |Finance        |1700       |
|108       |100          |112        |Jose Manuel|Urman    |JMURMAN |515.124.4469|2006-03-07 00:00:00.000|FI_ACCOUNT|7800  |              |Finance        |1700       |


Copy
Snowflake
 SELECT
    *
FROM
    hr.employees
    NATURAL JOIN
        hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|MANAGER_ID|DEPARTMENT_ID|EMPLOYEE_ID|FIRST_NAME |LAST_NAME|EMAIL   |PHONE_NUMBER|HIRE_DATE |JOB_ID    |SALARY  |COMMISSION_PCT|DEPARTMENT_NAME|LOCATION_ID|
|----------|-------------|-----------|-----------|---------|--------|------------|----------|----------|--------|--------------|---------------|-----------|
|100       |90           |101        |Neena      |Kochhar  |NKOCHHAR|515.123.4568|2005-09-21|AD_VP     |17000.00|              |Executive      |1700       |
|100       |90           |102        |Lex        |De Haan  |LDEHAAN |515.123.4569|2001-01-13|AD_VP     |17000.00|              |Executive      |1700       |
|103       |60           |104        |Bruce      |Ernst    |BERNST  |590.423.4568|2007-05-21|IT_PROG   |6000.00 |              |IT             |1400       |
|103       |60           |105        |David      |Austin   |DAUSTIN |590.423.4569|2005-06-25|IT_PROG   |4800.00 |              |IT             |1400       |
|103       |60           |106        |Valli      |Pataballa|VPATABAL|590.423.4560|2006-02-05|IT_PROG   |4800.00 |              |IT             |1400       |
|103       |60           |107        |Diana      |Lorentz  |DLORENTZ|590.423.5567|2007-02-07|IT_PROG   |4200.00 |              |IT             |1400       |
|108       |100          |109        |Daniel     |Faviet   |DFAVIET |515.124.4169|2002-08-16|FI_ACCOUNT|9000.00 |              |Finance        |1700       |
|108       |100          |110        |John       |Chen     |JCHEN   |515.124.4269|2005-09-28|FI_ACCOUNT|8200.00 |              |Finance        |1700       |
|108       |100          |111        |Ismael     |Sciarra  |ISCIARRA|515.124.4369|2005-09-30|FI_ACCOUNT|7700.00 |              |Finance        |1700       |
|108       |100          |112        |Jose Manuel|Urman    |JMURMAN |515.124.4469|2006-03-07|FI_ACCOUNT|7800.00 |              |Finance        |1700       |


Copy

자연 교차 조인

Oracle
 SELECT 
    *
FROM 
    hr.employees
NATURAL CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL|PHONE_NUMBER|HIRE_DATE              |JOB_ID |SALARY|COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME |MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|-----|------------|-----------------------|-------|------|--------------|----------|-------------|-------------|----------------|----------|-----------|
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |10           |Administration  |200       |1700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |100          |Finance         |108       |1700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |90           |Executive       |100       |1700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |80           |Sales           |145       |2500       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |70           |Public Relations|204       |2700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |60           |IT              |103       |1400       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |50           |Shipping        |121       |1500       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |40           |Human Resources |203       |2400       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |30           |Purchasing      |114       |1700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17 00:00:00.000|AD_PRES|24000 |              |          |90           |20           |Marketing       |201       |1800       |


Copy
Snowflake
 SELECT
    *
FROM
    hr.employees
    CROSS JOIN hr.departments
ORDER BY employee_id
FETCH NEXT 10 ROWS ONLY;
Copy
|EMPLOYEE_ID|FIRST_NAME|LAST_NAME|EMAIL|PHONE_NUMBER|HIRE_DATE |JOB_ID |SALARY  |COMMISSION_PCT|MANAGER_ID|DEPARTMENT_ID|DEPARTMENT_ID|DEPARTMENT_NAME |MANAGER_ID|LOCATION_ID|
|-----------|----------|---------|-----|------------|----------|-------|--------|--------------|----------|-------------|-------------|----------------|----------|-----------|
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |80           |Sales           |145       |2500       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |20           |Marketing       |201       |1800       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |60           |IT              |103       |1400       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |70           |Public Relations|204       |2700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |90           |Executive       |100       |1700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |30           |Purchasing      |114       |1700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |10           |Administration  |200       |1700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |100          |Finance         |108       |1700       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |50           |Shipping        |121       |1500       |
|100        |Steven    |King     |SKING|515.123.4567|2003-06-17|AD_PRES|24000.00|              |          |90           |40           |Human Resources |203       |2400       |


Copy

알려진 문제

1. Results ordering mismatch between languages

쿼리 결과는 두 데이터베이스 엔진에서 동일한 내용을 갖지만 쿼리에 Order By 절이 정의되지 않은 경우 순서가 다를 수 있습니다.

관련 EWIs

관련 EWIs 없음.

외부 조인

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

설명

외부 조인은 단순 조인의 결과를 확장합니다. 외부 조인은 조인 조건을 충족하는 모든 행을 반환하고 다른 테이블에서 조인 조건을 충족하는 행이 없는 한 테이블의 일부 또는 모든 행을 반환합니다. (Oracle SQL Language Reference 외부 조인 하위 섹션).

Oracle ANSI 구문

 [ query_partition_clause ] [ NATURAL ]
outer_join_type JOIN table_reference
 [ query_partition_clause ]
 [ ON condition
 | USING ( column [, column ]...)
 ]
Copy
 outer_join_type
{ FULL | LEFT | RIGHT } [ OUTER ]
Copy

Oracle은 또한 외부 조인을 수행하는 데 사용할 수 있는 (+) 연산자를 지원합니다. 이 연산자는 WHERE 절의 열 식에 추가됩니다.

 column_expression (+)
Copy

Snowflake ANSI 구문

Snowflake는 Oracle과 마찬가지로 OUTER JOINS 에 대한 ANSI 구문도 지원합니다. 단, (+) 연산자를 사용할 때의 동작은 용도에 따라 달라질 수 있습니다. Snowflake 조인에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.

Snowflake 문법은 다음 중 하나입니다.

 SELECT ...
FROM <object_ref1> [
                     {
                       INNER
                       | { LEFT | RIGHT | FULL } [ OUTER ]
                     }
                   ]
                   JOIN <object_ref2>
  [ ON <condition> ]
[ ... ]
Copy
 SELECT *
FROM <object_ref1> [
                     {
                       INNER
                       | { LEFT | RIGHT | FULL } [ OUTER ]
                     }
                   ]
                   JOIN <object_ref2>
  [ USING( <column_list> ) ]
[ ... ]
Copy
 SELECT ...
FROM <object_ref1> [
                     {
                       | NATURAL [ { LEFT | RIGHT | FULL } [ OUTER ] ]
                       | CROSS
                     }
                   ]
                   JOIN <object_ref2>
[ ... ]
Copy

샘플 소스 패턴

참고

주문 기준_ 절이 추가되었는데, 이는 Oracle과 Snowflake의 결과 순서가 다를 수 있기 때문입니다.

참고

결과 세트가 너무 커서 _Row Limiting Clause_가 추가되었습니다. 이를 제거하면 전체 결과 세트를 검색할 수 있습니다.

참고

샘플 데이터베이스를 설정하려면 이 섹션을 확인하십시오.

참고

다음 예제에서는 JOIN 의 각 종류에 대한 결과를 더 잘 구분하기 위해 이러한 삽입 및 변경 문을 실행했습니다.

 INSERT INTO hr.regions VALUES (5, 'Oceania');
ALTER TABLE hr.countries DROP CONSTRAINT countr_reg_fk;
INSERT INTO hr.countries VALUES ('--', 'Unknown Country', 0);
Copy

1. ANSI syntax

Snowflake는 SQL JOINS 에 대해 ANSI 구문을 완벽하게 지원합니다. 동작은 두 데이터베이스 엔진 모두 동일합니다.

왼쪽 외부 조인 위치

Oracle
 SELECT * FROM
hr.countries c
LEFT OUTER JOIN hr.regions r ON c.region_id = r.region_id
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME   |REGION_ID|REGION_ID|REGION_NAME|
----------+---------------+---------+---------+-----------+
--        |Unknown Country|        0|         |           |
AR        |Argentina      |        2|        2|Americas   |
AU        |Australia      |        3|        3|Asia       |
BE        |Belgium        |        1|        1|Europe     |
BR        |Brazil         |        2|        2|Americas   |
CA        |Canada         |        2|        2|Americas   |
CH        |Switzerland    |        1|        1|Europe     |
CN        |China          |        3|        3|Asia       |
DE        |Germany        |        1|        1|Europe     |
DK        |Denmark        |        1|        1|Europe     |

Copy
Snowflake
 SELECT * FROM
hr.countries c
LEFT OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME   |REGION_ID            |REGION_ID            |REGION_NAME|
----------+---------------+---------------------+---------------------+-----------+
--        |Unknown Country|0.0000000000000000000|                     |           |
AR        |Argentina      |2.0000000000000000000|2.0000000000000000000|Americas   |
AU        |Australia      |3.0000000000000000000|3.0000000000000000000|Asia       |
BE        |Belgium        |1.0000000000000000000|1.0000000000000000000|Europe     |
BR        |Brazil         |2.0000000000000000000|2.0000000000000000000|Americas   |
CA        |Canada         |2.0000000000000000000|2.0000000000000000000|Americas   |
CH        |Switzerland    |1.0000000000000000000|1.0000000000000000000|Europe     |
CN        |China          |3.0000000000000000000|3.0000000000000000000|Asia       |
DE        |Germany        |1.0000000000000000000|1.0000000000000000000|Europe     |
DK        |Denmark        |1.0000000000000000000|1.0000000000000000000|Europe     |

Copy

오른쪽 외부 조인 위치

Oracle
 SELECT * FROM
hr.countries c
RIGHT OUTER JOIN hr.regions r ON c.region_id = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME            |REGION_ID|REGION_ID|REGION_NAME           |
----------+------------------------+---------+---------+----------------------+
          |                        |         |        5|Oceania               |
ZW        |Zimbabwe                |        4|        4|Middle East and Africa|
ZM        |Zambia                  |        4|        4|Middle East and Africa|
US        |United States of America|        2|        2|Americas              |
UK        |United Kingdom          |        1|        1|Europe                |
SG        |Singapore               |        3|        3|Asia                  |
NL        |Netherlands             |        1|        1|Europe                |
NG        |Nigeria                 |        4|        4|Middle East and Africa|
MX        |Mexico                  |        2|        2|Americas              |
ML        |Malaysia                |        3|        3|Asia                  |

Copy
Snowflake
 SELECT * FROM
hr.countries c
RIGHT OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME            |REGION_ID            |REGION_ID            |REGION_NAME           |
----------+------------------------+---------------------+---------------------+----------------------+
          |                        |                     |5.0000000000000000000|Oceania               |
ZW        |Zimbabwe                |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
ZM        |Zambia                  |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
US        |United States of America|2.0000000000000000000|2.0000000000000000000|Americas              |
UK        |United Kingdom          |1.0000000000000000000|1.0000000000000000000|Europe                |
SG        |Singapore               |3.0000000000000000000|3.0000000000000000000|Asia                  |
NL        |Netherlands             |1.0000000000000000000|1.0000000000000000000|Europe                |
NG        |Nigeria                 |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
MX        |Mexico                  |2.0000000000000000000|2.0000000000000000000|Americas              |
ML        |Malaysia                |3.0000000000000000000|3.0000000000000000000|Asia                  |

Copy

전체 외부 조인 위치

Oracle
 SELECT * FROM
hr.countries c
FULL OUTER JOIN hr.regions r ON c.region_id = r.region_id
ORDER BY r.region_name DESC, c.country_id
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME   |REGION_ID|REGION_ID|REGION_NAME           |
----------+---------------+---------+---------+----------------------+
--        |Unknown Country|        0|         |                      |
          |               |         |        5|Oceania               |
EG        |Egypt          |        4|        4|Middle East and Africa|
IL        |Israel         |        4|        4|Middle East and Africa|
KW        |Kuwait         |        4|        4|Middle East and Africa|
NG        |Nigeria        |        4|        4|Middle East and Africa|
ZM        |Zambia         |        4|        4|Middle East and Africa|
ZW        |Zimbabwe       |        4|        4|Middle East and Africa|
BE        |Belgium        |        1|        1|Europe                |
CH        |Switzerland    |        1|        1|Europe                |

Copy
Snowflake
 SELECT * FROM
hr.countries c
FULL OUTER JOIN
hr.regions r ON c.region_id = r.region_id
ORDER BY r.region_name DESC, c.country_id
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME   |REGION_ID            |REGION_ID            |REGION_NAME           |
----------+---------------+---------------------+---------------------+----------------------+
--        |Unknown Country|0.0000000000000000000|                     |                      |
          |               |                     |5.0000000000000000000|Oceania               |
EG        |Egypt          |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
IL        |Israel         |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
KW        |Kuwait         |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
NG        |Nigeria        |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
ZM        |Zambia         |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
ZW        |Zimbabwe       |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
BE        |Belgium        |1.0000000000000000000|1.0000000000000000000|Europe                |
CH        |Switzerland    |1.0000000000000000000|1.0000000000000000000|Europe                |

Copy

2. Natural Outer Join

Oracle과 Snowflake는 모두 자연 외부 조인을 지원하며 동일한 방식으로 작동합니다.

NATURAL JOIN 은 공통 열이 출력에 한 번만 포함된다는 점을 제외하고는, 두 테이블의 공통 열에 대한 명시적 JOIN 과 동일합니다. (자연 조인은 이름이 같지만 서로 다른 테이블에 있는 열에 해당 데이터가 포함되어 있다고 가정합니다.)(Snowflake SQL Language Reference JOIN)

자연 왼쪽 외부 조인

Oracle
 SELECT * FROM
hr.countries c
NATURAL LEFT OUTER JOIN hr.regions r
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
REGION_ID|COUNTRY_ID|COUNTRY_NAME   |REGION_NAME|
---------+----------+---------------+-----------+
        0|--        |Unknown Country|           |
        2|AR        |Argentina      |Americas   |
        3|AU        |Australia      |Asia       |
        1|BE        |Belgium        |Europe     |
        2|BR        |Brazil         |Americas   |
        2|CA        |Canada         |Americas   |
        1|CH        |Switzerland    |Europe     |
        3|CN        |China          |Asia       |
        1|DE        |Germany        |Europe     |
        1|DK        |Denmark        |Europe     |

Copy
Snowflake
 SELECT * FROM
hr.countries c
NATURAL LEFT OUTER JOIN
hr.regions r
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
REGION_ID            |COUNTRY_ID|COUNTRY_NAME   |REGION_NAME|
---------------------+----------+---------------+-----------+
0.0000000000000000000|--        |Unknown Country|           |
2.0000000000000000000|AR        |Argentina      |Americas   |
3.0000000000000000000|AU        |Australia      |Asia       |
1.0000000000000000000|BE        |Belgium        |Europe     |
2.0000000000000000000|BR        |Brazil         |Americas   |
2.0000000000000000000|CA        |Canada         |Americas   |
1.0000000000000000000|CH        |Switzerland    |Europe     |
3.0000000000000000000|CN        |China          |Asia       |
1.0000000000000000000|DE        |Germany        |Europe     |
1.0000000000000000000|DK        |Denmark        |Europe     |

Copy

자연 오른쪽 외부 조인

Oracle
 SELECT * FROM
hr.countries c
NATURAL RIGHT OUTER JOIN hr.regions r
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
REGION_ID|COUNTRY_ID|COUNTRY_NAME            |REGION_NAME           |
---------+----------+------------------------+----------------------+
        5|          |                        |Oceania               |
        4|ZW        |Zimbabwe                |Middle East and Africa|
        4|ZM        |Zambia                  |Middle East and Africa|
        2|US        |United States of America|Americas              |
        1|UK        |United Kingdom          |Europe                |
        3|SG        |Singapore               |Asia                  |
        1|NL        |Netherlands             |Europe                |
        4|NG        |Nigeria                 |Middle East and Africa|
        2|MX        |Mexico                  |Americas              |
        3|ML        |Malaysia                |Asia                  |

Copy
Snowflake
 SELECT * FROM
hr.countries c
NATURAL RIGHT OUTER JOIN
hr.regions r
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
REGION_ID            |COUNTRY_ID|COUNTRY_NAME            |REGION_NAME           |
---------------------+----------+------------------------+----------------------+
5.0000000000000000000|          |                        |Oceania               |
4.0000000000000000000|ZW        |Zimbabwe                |Middle East and Africa|
4.0000000000000000000|ZM        |Zambia                  |Middle East and Africa|
2.0000000000000000000|US        |United States of America|Americas              |
1.0000000000000000000|UK        |United Kingdom          |Europe                |
3.0000000000000000000|SG        |Singapore               |Asia                  |
1.0000000000000000000|NL        |Netherlands             |Europe                |
4.0000000000000000000|NG        |Nigeria                 |Middle East and Africa|
2.0000000000000000000|MX        |Mexico                  |Americas              |
3.0000000000000000000|ML        |Malaysia                |Asia                  |

Copy

3. Basic Outer Join with USING

USING 키워드를 사용하여 테이블 열을 조인할 수 있습니다. 결과는 ON 키워드가 포함된 기본 OUTER JOIN 과 동일합니다.

다음을 사용한 왼쪽 외부 조인

_ Oracle _

 SELECT * FROM
hr.countries c
LEFT OUTER JOIN hr.regions r USING (region_id)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
REGION_ID|COUNTRY_ID|COUNTRY_NAME   |REGION_NAME|
---------+----------+---------------+-----------+
        0|--        |Unknown Country|           |
        2|AR        |Argentina      |Americas   |
        3|AU        |Australia      |Asia       |
        1|BE        |Belgium        |Europe     |
        2|BR        |Brazil         |Americas   |
        2|CA        |Canada         |Americas   |
        1|CH        |Switzerland    |Europe     |
        3|CN        |China          |Asia       |
        1|DE        |Germany        |Europe     |
        1|DK        |Denmark        |Europe     |

Copy
Snowflake
 SELECT * FROM
hr.countries c
LEFT OUTER JOIN
hr.regions r USING (region_id)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
REGION_ID            |COUNTRY_ID|COUNTRY_NAME   |REGION_NAME|
---------------------+----------+---------------+-----------+
0.0000000000000000000|--        |Unknown Country|           |
2.0000000000000000000|AR        |Argentina      |Americas   |
3.0000000000000000000|AU        |Australia      |Asia       |
1.0000000000000000000|BE        |Belgium        |Europe     |
2.0000000000000000000|BR        |Brazil         |Americas   |
2.0000000000000000000|CA        |Canada         |Americas   |
1.0000000000000000000|CH        |Switzerland    |Europe     |
3.0000000000000000000|CN        |China          |Asia       |
1.0000000000000000000|DE        |Germany        |Europe     |
1.0000000000000000000|DK        |Denmark        |Europe     |

Copy

4. (+) Operator

Oracle과 Snowflake에는 외부 조인에도 사용할 수 있는 (+) 연산자가 있습니다. 경우에 따라 이 연산자를 사용할 때 Snowflake가 올바르게 작동하지 않을 수 있습니다.

Snowflake의 이 연산자에 대한 자세한 내용은 여기 에서 확인할 수 있습니다.

(+) 연산자를 사용한 왼쪽 외부 조인

Oracle
 SELECT * FROM hr.countries c, hr.regions r
WHERE c.region_id = r.region_id(+)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME   |REGION_ID|REGION_ID|REGION_NAME|
----------+---------------+---------+---------+-----------+
--        |Unknown Country|        0|         |           |
AR        |Argentina      |        2|        2|Americas   |
AU        |Australia      |        3|        3|Asia       |
BE        |Belgium        |        1|        1|Europe     |
BR        |Brazil         |        2|        2|Americas   |
CA        |Canada         |        2|        2|Americas   |
CH        |Switzerland    |        1|        1|Europe     |
CN        |China          |        3|        3|Asia       |
DE        |Germany        |        1|        1|Europe     |
DK        |Denmark        |        1|        1|Europe     |

Copy
Snowflake
 SELECT * FROM
hr.countries c,
hr.regions r
WHERE c.region_id = r.region_id(+)
ORDER BY country_id
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME   |REGION_ID            |REGION_ID            |REGION_NAME|
----------+---------------+---------------------+---------------------+-----------+
--        |Unknown Country|0.0000000000000000000|                     |           |
AR        |Argentina      |2.0000000000000000000|2.0000000000000000000|Americas   |
AU        |Australia      |3.0000000000000000000|3.0000000000000000000|Asia       |
BE        |Belgium        |1.0000000000000000000|1.0000000000000000000|Europe     |
BR        |Brazil         |2.0000000000000000000|2.0000000000000000000|Americas   |
CA        |Canada         |2.0000000000000000000|2.0000000000000000000|Americas   |
CH        |Switzerland    |1.0000000000000000000|1.0000000000000000000|Europe     |
CN        |China          |3.0000000000000000000|3.0000000000000000000|Asia       |
DE        |Germany        |1.0000000000000000000|1.0000000000000000000|Europe     |
DK        |Denmark        |1.0000000000000000000|1.0000000000000000000|Europe     |

Copy

(+) 연산자를 사용한 오른쪽 외부 조인

Oracle
 SELECT * FROM hr.countries c, hr.regions r
WHERE c.region_id (+) = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME            |REGION_ID|REGION_ID|REGION_NAME           |
----------+------------------------+---------+---------+----------------------+
          |                        |         |        5|Oceania               |
ZW        |Zimbabwe                |        4|        4|Middle East and Africa|
ZM        |Zambia                  |        4|        4|Middle East and Africa|
US        |United States of America|        2|        2|Americas              |
UK        |United Kingdom          |        1|        1|Europe                |
SG        |Singapore               |        3|        3|Asia                  |
NL        |Netherlands             |        1|        1|Europe                |
NG        |Nigeria                 |        4|        4|Middle East and Africa|
MX        |Mexico                  |        2|        2|Americas              |
ML        |Malaysia                |        3|        3|Asia                  |

Copy
Snowflake
 SELECT * FROM
hr.countries c,
hr.regions r
WHERE c.region_id (+) = r.region_id
ORDER BY country_id DESC
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME            |REGION_ID            |REGION_ID            |REGION_NAME           |
----------+------------------------+---------------------+---------------------+----------------------+
          |                        |                     |5.0000000000000000000|Oceania               |
ZW        |Zimbabwe                |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
ZM        |Zambia                  |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
US        |United States of America|2.0000000000000000000|2.0000000000000000000|Americas              |
UK        |United Kingdom          |1.0000000000000000000|1.0000000000000000000|Europe                |
SG        |Singapore               |3.0000000000000000000|3.0000000000000000000|Asia                  |
NL        |Netherlands             |1.0000000000000000000|1.0000000000000000000|Europe                |
NG        |Nigeria                 |4.0000000000000000000|4.0000000000000000000|Middle East and Africa|
MX        |Mexico                  |2.0000000000000000000|2.0000000000000000000|Americas              |
ML        |Malaysia                |3.0000000000000000000|3.0000000000000000000|Asia                  |

Copy

(+)를 사용하여 여러 테이블과 조인된 단일 테이블

Oracle에서는 (+) 연산자를 사용하여 단일 테이블을 여러 테이블과 조인할 수 있지만, Snowflake에서는 이를 지원하지 않습니다. 이러한 외부 조인을 사용하는 쿼리는ANSI구문으로 변경됩니다.

Oracle
 SELECT
c.country_id,
c.country_name,
r.region_id,
r.region_name,
l.location_id,
l.street_address,
l.postal_code,
l.city
FROM
hr.countries c, hr.regions r,  hr.locations l
WHERE
c.region_id(+) = r.region_id AND
l.country_id = c.country_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
|COUNTRY_ID|COUNTRY_NAME  |REGION_ID|REGION_NAME|LOCATION_ID|STREET_ADDRESS                          |POSTAL_CODE|CITY       |
|----------|--------------|---------|-----------|-----------|----------------------------------------|-----------|-----------|
|          |              |1        |Europe     |2000       |40-5-12 Laogianggen                     |190518     |Beijing    |
|CH        |Switzerland   |1        |Europe     |3000       |Murtenstrasse 921                       |3095       |Bern       |
|          |              |1        |Europe     |2100       |1298 Vileparle (E)                      |490231     |Bombay     |
|CH        |Switzerland   |1        |Europe     |2900       |20 Rue des Corps-Saints                 |1730       |Geneva     |
|          |              |1        |Europe     |1300       |9450 Kamiya-cho                         |6823       |Hiroshima  |
|UK        |United Kingdom|1        |Europe     |2400       |8204 Arthur St                          |           |London     |
|          |              |1        |Europe     |3200       |Mariano Escobedo 9991                   |11932      |Mexico City|
|DE        |Germany       |1        |Europe     |2700       |Schwanthalerstr. 7031                   |80925      |Munich     |
|UK        |United Kingdom|1        |Europe     |2500       |Magdalen Centre, The Oxford Science Park|OX9 9ZB    |Oxford     |
|IT        |Italy         |1        |Europe     |1000       |1297 Via Cola di Rie                    |00989      |Roma       |

Copy
Snowflake
 SELECT
c.country_id,
c.country_name,
r.region_id,
r.region_name,
l.location_id,
l.street_address,
l.postal_code,
l.city
FROM
hr.regions r
CROSS JOIN hr.locations l
LEFT OUTER JOIN
hr.countries c
ON
c.region_id = r.region_id
AND
l.country_id = c.country_id
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME  |REGION_ID            |REGION_NAME|LOCATION_ID|STREET_ADDRESS                          |POSTAL_CODE|CITY       |
----------+--------------+---------------------+-----------+-----------+----------------------------------------+-----------+-----------+
          |              |1.0000000000000000000|Europe     |       2000|40-5-12 Laogianggen                     |190518     |Beijing    |
CH        |Switzerland   |1.0000000000000000000|Europe     |       3000|Murtenstrasse 921                       |3095       |Bern       |
          |              |1.0000000000000000000|Europe     |       2100|1298 Vileparle (E)                      |490231     |Bombay     |
CH        |Switzerland   |1.0000000000000000000|Europe     |       2900|20 Rue des Corps-Saints                 |1730       |Geneva     |
          |              |1.0000000000000000000|Europe     |       1300|9450 Kamiya-cho                         |6823       |Hiroshima  |
UK        |United Kingdom|1.0000000000000000000|Europe     |       2400|8204 Arthur St                          |           |London     |
          |              |1.0000000000000000000|Europe     |       3200|Mariano Escobedo 9991                   |11932      |Mexico City|
DE        |Germany       |1.0000000000000000000|Europe     |       2700|Schwanthalerstr. 7031                   |80925      |Munich     |
UK        |United Kingdom|1.0000000000000000000|Europe     |       2500|Magdalen Centre, The Oxford Science Park|OX9 9ZB    |Oxford     |
IT        |Italy         |1.0000000000000000000|Europe     |       1000|1297 Via Cola di Rie                    |00989      |Roma       |

Copy

조인되지 않은 테이블의 열과 열이 아닌 값에 (+) 연산자 사용

Oracle에서는 열에 (+) 연산자를 사용하여 다른 테이블의 열이 아닌 값과 조인할 수 있습니다. Snowflake도 이 작업을 수행할 수 있지만 열의 테이블이 다른 테이블과 조인되지 않은 경우 실패합니다. 이 문제를 해결하기 위해 이 시나리오가 발생하면 쿼리에서 (+) 연산자가 제거되며 결과는 Oracle에서와 동일합니다.

Oracle
 SELECT * FROM hr.regions r
WHERE
r.region_name (+) LIKE 'A%'
ORDER BY region_id;
Copy
REGION_ID|REGION_NAME|
---------+-----------+
        2|Americas   |
        3|Asia       |

Copy
Snowflake
 SELECT * FROM
hr.regions r
WHERE
r.region_name LIKE 'A%'
ORDER BY region_id;
Copy
REGION_ID            |REGION_NAME|
---------------------+-----------+
2.0000000000000000000|Americas   |
3.0000000000000000000|Asia       |

Copy

알려진 문제

지원되지 않는 모든 사례에 대해서는 관련 EWIs 에서 권장 사항과 가능한 해결 방법을 확인하십시오.

1. Converted Outer Joins to ANSI syntax might reorder de columns

ANSI 외부 조인이 아닌 쿼리가 ANSI 외부 조인으로 변환되는 경우 변환된 쿼리의 열 순서가 변경될 수 있습니다. 이 문제를 해결하려면 특정 순서대로 열을 선택해 보십시오.

Oracle
 SELECT
*
FROM
hr.countries c, hr.regions r,  hr.locations l
WHERE
c.region_id(+) = r.region_id AND
l.country_id = c.country_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME  |REGION_ID|REGION_ID|REGION_NAME|LOCATION_ID|STREET_ADDRESS                          |POSTAL_CODE|CITY       |STATE_PROVINCE   |COUNTRY_ID|
----------+--------------+---------+---------+-----------+-----------+----------------------------------------+-----------+-----------+-----------------+----------+
          |              |         |        1|Europe     |       2000|40-5-12 Laogianggen                     |190518     |Beijing    |                 |CN        |
CH        |Switzerland   |        1|        1|Europe     |       3000|Murtenstrasse 921                       |3095       |Bern       |BE               |CH        |
          |              |         |        1|Europe     |       2100|1298 Vileparle (E)                      |490231     |Bombay     |Maharashtra      |IN        |
CH        |Switzerland   |        1|        1|Europe     |       2900|20 Rue des Corps-Saints                 |1730       |Geneva     |Geneve           |CH        |
          |              |         |        1|Europe     |       1300|9450 Kamiya-cho                         |6823       |Hiroshima  |                 |JP        |
UK        |United Kingdom|        1|        1|Europe     |       2400|8204 Arthur St                          |           |London     |                 |UK        |
          |              |         |        1|Europe     |       3200|Mariano Escobedo 9991                   |11932      |Mexico City|Distrito Federal,|MX        |
DE        |Germany       |        1|        1|Europe     |       2700|Schwanthalerstr. 7031                   |80925      |Munich     |Bavaria          |DE        |
UK        |United Kingdom|        1|        1|Europe     |       2500|Magdalen Centre, The Oxford Science Park|OX9 9ZB    |Oxford     |Oxford           |UK        |
IT        |Italy         |        1|        1|Europe     |       1000|1297 Via Cola di Rie                    |00989      |Roma       |                 |IT        |

Copy
Snowflake
 SELECT
*
FROM
hr.regions r
CROSS JOIN hr.locations l
LEFT OUTER JOIN
hr.countries c
ON
c.region_id = r.region_id
AND
l.country_id = c.country_id
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
REGION_ID            |REGION_NAME|LOCATION_ID|STREET_ADDRESS                          |POSTAL_CODE|CITY       |STATE_PROVINCE   |COUNTRY_ID|COUNTRY_ID|COUNTRY_NAME  |REGION_ID            |
---------------------+-----------+-----------+----------------------------------------+-----------+-----------+-----------------+----------+----------+--------------+---------------------+
1.0000000000000000000|Europe     |       2000|40-5-12 Laogianggen                     |190518     |Beijing    |                 |CN        |          |              |                     |
1.0000000000000000000|Europe     |       3000|Murtenstrasse 921                       |3095       |Bern       |BE               |CH        |CH        |Switzerland   |1.0000000000000000000|
1.0000000000000000000|Europe     |       2100|1298 Vileparle (E)                      |490231     |Bombay     |Maharashtra      |IN        |          |              |                     |
1.0000000000000000000|Europe     |       2900|20 Rue des Corps-Saints                 |1730       |Geneva     |Geneve           |CH        |CH        |Switzerland   |1.0000000000000000000|
1.0000000000000000000|Europe     |       1300|9450 Kamiya-cho                         |6823       |Hiroshima  |                 |JP        |          |              |                     |
1.0000000000000000000|Europe     |       2400|8204 Arthur St                          |           |London     |                 |UK        |UK        |United Kingdom|1.0000000000000000000|
1.0000000000000000000|Europe     |       3200|Mariano Escobedo 9991                   |11932      |Mexico City|Distrito Federal,|MX        |          |              |                     |
1.0000000000000000000|Europe     |       2700|Schwanthalerstr. 7031                   |80925      |Munich     |Bavaria          |DE        |DE        |Germany       |1.0000000000000000000|
1.0000000000000000000|Europe     |       2500|Magdalen Centre, The Oxford Science Park|OX9 9ZB    |Oxford     |Oxford           |UK        |UK        |United Kingdom|1.0000000000000000000|
1.0000000000000000000|Europe     |       1000|1297 Via Cola di Rie                    |00989      |Roma       |                 |IT        |IT        |Italy         |1.0000000000000000000|

Copy
2. Outer joined between predicate with an interval with multiple tables

between 조건자는 비 ANSI OUTER JOINS 에 사용할 수 있습니다. Oracle에서는 간격 내부의 열이 다른 테이블에 있더라도 외부 조인이 가능하지만, Snowflake는 이를 지원하지 않습니다. 이러한 경우 between 조건자는 설명이 생략됩니다.

Oracle
 SELECT
*
FROM 
hr.countries c, hr.regions r,  hr.locations l WHERE 
l.location_id  BETWEEN r.region_id(+) AND c.region_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy
COUNTRY_ID|COUNTRY_NAME|REGION_ID|REGION_ID|REGION_NAME|LOCATION_ID|STREET_ADDRESS                          |POSTAL_CODE|CITY       |STATE_PROVINCE   |COUNTRY_ID|
----------+------------+---------+---------+-----------+-----------+----------------------------------------+-----------+-----------+-----------------+----------+
          |            |         |        1|Europe     |       2000|40-5-12 Laogianggen                     |190518     |Beijing    |                 |CN        |
          |            |         |        1|Europe     |       3000|Murtenstrasse 921                       |3095       |Bern       |BE               |CH        |
          |            |         |        1|Europe     |       2100|1298 Vileparle (E)                      |490231     |Bombay     |Maharashtra      |IN        |
          |            |         |        1|Europe     |       2900|20 Rue des Corps-Saints                 |1730       |Geneva     |Geneve           |CH        |
          |            |         |        1|Europe     |       1300|9450 Kamiya-cho                         |6823       |Hiroshima  |                 |JP        |
          |            |         |        1|Europe     |       2400|8204 Arthur St                          |           |London     |                 |UK        |
          |            |         |        1|Europe     |       3200|Mariano Escobedo 9991                   |11932      |Mexico City|Distrito Federal,|MX        |
          |            |         |        1|Europe     |       2700|Schwanthalerstr. 7031                   |80925      |Munich     |Bavaria          |DE        |
          |            |         |        1|Europe     |       2500|Magdalen Centre, The Oxford Science Park|OX9 9ZB    |Oxford     |Oxford           |UK        |
          |            |         |        1|Europe     |       1000|1297 Via Cola di Rie                    |00989      |Roma       |                 |IT        |

Copy
Snowflake
 SELECT
*
FROM
hr.countries c,
hr.regions r,
hr.locations l WHERE
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0090 - INVALID NON-ANSI OUTER JOIN BETWEEN PREDICATE CASE FOR SNOWFLAKE. ***/!!!
l.location_id  BETWEEN r.region_id(+) AND c.region_id(+)
ORDER BY r.region_id, l.city
FETCH FIRST 10 ROWS ONLY;
Copy

관련 EWIs

  1. SSC-EWI-OR0090: 비 Ansi 외부 조인에 잘못된 Between 조건자가 있습니다.

셀프 조인

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

설명

셀프 조인은 테이블을 테이블 자체에 조인하는 것입니다. 이 테이블은 FROM 절에 두 번 나타나며 그 뒤에 조인 조건에서 열 이름을 한정하는 테이블 별칭이 나옵니다. (Oracle SQL Language Reference 셀프 조인 하위 섹션)

샘플 소스 패턴

참고

주문 기준_ 절이 추가되었는데, 이는 Oracle과 Snowflake의 결과 순서가 다를 수 있기 때문입니다.

참고

샘플 데이터베이스를 설정하려면 이 섹션을 확인하십시오.

기본 셀프 조인 사례

Oracle
 SELECT e1.last_name||' works for '||e2.last_name 
   "Employees and Their Managers"
   FROM hr.employees e1, hr.employees e2 
   WHERE e1.manager_id = e2.employee_id
      AND e1.last_name LIKE 'R%'
   ORDER BY e1.last_name;
Copy
Employees and Their Managers|
----------------------------+
Rajs works for Mourgos      |
Raphaely works for King     |
Rogers works for Kaufling   |
Russell works for King      |

Copy
Snowflake
 SELECT
   NVL( e1.last_name :: STRING, '') || ' works for ' || NVL(e2.last_name :: STRING, '') "Employees and Their Managers"
FROM
   hr.employees e1,
   hr.employees e2
   WHERE e1.manager_id = e2.employee_id
      AND e1.last_name LIKE 'R%'
   ORDER BY e1.last_name;
Copy
Employees and Their Managers|
----------------------------+
Rajs works for Mourgos      |
Raphaely works for King     |
Rogers works for Kaufling   |
Russell works for King      |

Copy

참고

앞서 증명했듯이 Oracle의 self join 은 기능적으로 Snowflake와 동일합니다.

Known Issues

문제가 발견되지 않았습니다.

관련 EWIs

관련 EWIs 없음.

세미 조인

참고

출력 코드의 일부 부분은 명확성을 위해 생략되었습니다.

설명

세미 조인은 오른쪽의 여러 행이 하위 쿼리의 조건을 만족하는 경우 조건자의 왼쪽에서 행을 중복하지 않고 EXISTS 하위 쿼리와 일치하는 행을 반환합니다. 하위 쿼리가 WHERE 절의 OR 분기에 있는 경우 세미 조인 변환을 수행할 수 없습니다. (Oracle SQL Language Reference 세미 조인 하위 섹션)

샘플 소스 패턴

참고

주문 기준_ 절이 추가되었는데, 이는 Oracle과 Snowflake의 결과 순서가 다를 수 있기 때문입니다.

참고

샘플 데이터베이스를 설정하려면 이 섹션을 확인하십시오.

기본 세미 조인 사례

Oracle
 SELECT * FROM hr.departments 
   WHERE EXISTS 
   (SELECT * FROM hr.employees 
       WHERE departments.department_id = employees.department_id 
       AND employees.salary > 2500)
   ORDER BY department_name;
Copy
DEPARTMENT_ID|DEPARTMENT_NAME |MANAGER_ID|LOCATION_ID|
-------------+----------------+----------+-----------+
          110|Accounting      |       205|       1700|
           10|Administration  |       200|       1700|
           90|Executive       |       100|       1700|
          100|Finance         |       108|       1700|
           40|Human Resources |       203|       2400|
           60|IT              |       103|       1400|
           20|Marketing       |       201|       1800|
           70|Public Relations|       204|       2700|
           30|Purchasing      |       114|       1700|
           80|Sales           |       145|       2500|
           50|Shipping        |       121|       1500|

Copy
Snowflake
 SELECT * FROM
   hr.departments
   WHERE EXISTS
   (SELECT * FROM
         hr.employees
       WHERE departments.department_id = employees.department_id
       AND employees.salary > 2500)
   ORDER BY department_name;
Copy
DEPARTMENT_ID|DEPARTMENT_NAME |MANAGER_ID|LOCATION_ID|
-------------+----------------+----------+-----------+
          110|Accounting      |       205|       1700|
           10|Administration  |       200|       1700|
           90|Executive       |       100|       1700|
          100|Finance         |       108|       1700|
           40|Human Resources |       203|       2400|
           60|IT              |       103|       1400|
           20|Marketing       |       201|       1800|
           70|Public Relations|       204|       2700|
           30|Purchasing      |       114|       1700|
           80|Sales           |       145|       2500|
           50|Shipping        |       121|       1500|

Copy

참고

앞서 증명했듯이 Oracle의 semijoin 은 기능적으로 Snowflake와 동일합니다.

Known Issues

문제가 발견되지 않았습니다.

관련 EWIs

관련 EWIs 없음.