SnowConvert AI - Oracle - 조인

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

안티 조인

참고

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

설명

안티 조인은 조건자의 오른쪽에 해당하는 행이 없는 경우 조건자의 왼쪽에서 행을 반환합니다. 오른쪽의 하위 쿼리와 일치하지 않는 행을 반환합니다(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

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

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

재무부

130

법인세

140

제어 및 크레딧

150

주주 서비스

160

이점

170

Manufacturing

180

생성

190

계약

200

작업

210

IT 지원

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

재무부

130

법인세

140

제어 및 크레딧

150

주주 서비스

160

이점

170

Manufacturing

180

생성

190

계약

200

작업

210

IT 지원

알려진 문제

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의 급여는 Abel의 급여보다 100 적거나 100 더 많음

Abel의 급여는 Cambrault의 급여보다 100 적거나 100 더 많음

Abel의 급여는 Raphaelyl의 급여보다 100 적거나 100 더 많음

Ande의 급여는 Ande의 급여보다 100 적거나 100 더 많음

Ande의 급여는 Mavris의 급여보다 100 적거나 100 더 많음

Ande의 급여는 Vollman의 급여보다 100 적거나 100 더 많음

Atkinson의 급여는 Atkinson의 급여보다 100 적거나 100 더 많음

Atkinson의 급여는 Baida의 급여보다 100 적거나 100 더 많음

Atkinson의 급여는 Gates의 급여보다 100 적거나 100 더 많음

Atkinson의 급여는 Geoni의 급여보다 100 적거나 100 더 많음

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의 급여는 Abel의 급여보다 100 적거나 100 더 많음

Abel의 급여는 Cambrault의 급여보다 100 적거나 100 더 많음

Abel의 급여는 Raphaelyl의 급여보다 100 적거나 100 더 많음

Ande의 급여는 Ande의 급여보다 100 적거나 100 더 많음

Ande의 급여는 Mavris의 급여보다 100 적거나 100 더 많음

Ande의 급여는 Vollman의 급여보다 100 적거나 100 더 많음

Atkinson의 급여는 Atkinson의 급여보다 100 적거나 100 더 많음

Atkinson의 급여는 Baida의 급여보다 100 적거나 100 더 많음

Atkinson의 급여는 Gates의 급여보다 100 적거나 100 더 많음

Atkinson의 급여는 Geoni의 급여보다 100 적거나 100 더 많음

경고

해당 테이블이 없는 일부 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
결과 1

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

관리

200

1700

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

50

배송

121

1500

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

40

인적 리소스

203

2400

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

30

구매

114

1700

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

20

마케팅

201

1800

결과 2

COUNT(*)

2889

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
결과 1

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

인적 리소스

203

2400

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10

ST_MAN

8200.00

100

50

20

마케팅

201

1800

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10

ST_MAN

8200.00

100

50

10

관리

200

1700

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10

ST_MAN

8200.00

100

50

50

배송

121

1500

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10

ST_MAN

8200.00

100

50

30

구매

114

1700

결과 2

COUNT(*)

2889

교차 조인 구문

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
결과 1

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

관리

200

1700

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

50

배송

121

1500

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

40

인적 리소스

203

2400

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

30

구매

114

1700

121

Adam

Fripp

AFRIPP

650.123.2234

2005-04-10 00:00:00.000

ST_MAN

8200

100

50

20

마케팅

201

1800

결과 2

COUNT(*)

2889

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

배송

Austin

IT_PROG

60

IT

Baer

PR_REP

70

홍보

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

배송

Austin

IT_PROG

60

IT

Baer

PR_REP

70

홍보

알려진 문제

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

실행

100

1700

101

Neena

Kochhar

NKOCHHAR

515.123.4568

2005-09-21 00:00:00.000

AD_VP

17000

100

90

90

실행

100

1700

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13 00:00:00.000

AD_VP

17000

100

90

90

실행

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

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

실행

100

1700

101

Neena

Kochhar

NKOCHHAR

515.123.4568

2005-09-21

AD_VP

17000.00

100

90

90

실행

100

1700

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13

AD_VP

17000.00

100

90

90

실행

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

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

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

실행

100

1700

90

101

Neena

Kochhar

NKOCHHAR

515.123.4568

2005-09-21 00:00:00.000

AD_VP

17000

100

실행

100

1700

90

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13 00:00:00.000

AD_VP

17000

100

실행

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

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

실행

100

1700

90

101

Neena

Kochhar

NKOCHHAR

515.123.4568

2005-09-21

AD_VP

17000.00

100

실행

100

1700

90

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13

AD_VP

17000.00

100

실행

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

교차 내부 조인

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

회계

205

1700

101

Neena

Kochhar

NKOCHHAR

515.123.4568

2005-09-21 00:00:00.000

AD_VP

17000

100

90

110

회계

205

1700

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13 00:00:00.000

AD_VP

17000

100

90

110

회계

205

1700

103

Alexander

Hunold

AHUNOLD

590.423.4567

2006-01-03 00:00:00.000

IT_PROG

9000

102

60

110

회계

205

1700

104

Bruce

Ernst

BERNST

590.423.4568

2007-05-21 00:00:00.000

IT_PROG

6000

103

60

110

회계

205

1700

105

David

Austin

DAUSTIN

590.423.4569

2005-06-25 00:00:00.000

IT_PROG

4800

103

60

110

회계

205

1700

106

Valli

Pataballa

VPATABAL

590.423.4560

2006-02-05 00:00:00.000

IT_PROG

4800

103

60

110

회계

205

1700

107

Diana

Lorentz

DLORENTZ

590.423.5567

2007-02-07 00:00:00.000

IT_PROG

4200

103

60

110

회계

205

1700

108

Nancy

Greenberg

NGREENBE

515.124.4569

2002-08-17 00:00:00.000

FI_MGR

12008

101

100

110

회계

205

1700

109

Daniel

Faviet

DFAVIET

515.124.4169

2002-08-16 00:00:00.000

FI_ACCOUNT

9000

108

100

110

회계

205

1700

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

회계

205

1700

101

Neena

Kochhar

NKOCHHAR

515.123.4568

2005-09-21

AD_VP

17000.00

100

90

110

회계

205

1700

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13

AD_VP

17000.00

100

90

110

회계

205

1700

103

Alexander

Hunold

AHUNOLD

590.423.4567

2006-01-03

IT_PROG

9000.00

102

60

110

회계

205

1700

104

Bruce

Ernst

BERNST

590.423.4568

2007-05-21

IT_PROG

6000.00

103

60

110

회계

205

1700

105

David

Austin

DAUSTIN

590.423.4569

2005-06-25

IT_PROG

4800.00

103

60

110

회계

205

1700

106

Valli

Pataballa

VPATABAL

590.423.4560

2006-02-05

IT_PROG

4800.00

103

60

110

회계

205

1700

107

Diana

Lorentz

DLORENTZ

590.423.5567

2007-02-07

IT_PROG

4200.00

103

60

110

회계

205

1700

108

Nancy

Greenberg

NGREENBE

515.124.4569

2002-08-17

FI_MGR

12008.00

101

100

110

회계

205

1700

109

Daniel

Faviet

DFAVIET

515.124.4169

2002-08-16

FI_ACCOUNT

9000.00

108

100

110

회계

205

1700

자연 내부 조인

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

실행

1700

100

90

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13 00:00:00.000

AD_VP

17000

실행

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

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

실행

1700

100

90

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13

AD_VP

17000.00

실행

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

교차 자연 조인

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

실행

1700

100

90

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13 00:00:00.000

AD_VP

17000

실행

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

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

실행

1700

100

90

102

Lex

De Haan

LDEHAAN

515.123.4569

2001-01-13

AD_VP

17000.00

실행

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

자연 교차 조인

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

관리

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

실행

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

홍보

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

배송

121

1500

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

40

인적 리소스

203

2400

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

30

구매

114

1700

100

Steven

King

SKING

515.123.4567

2003-06-17 00:00:00.000

AD_PRES

24000

90

20

마케팅

201

1800

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

마케팅

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

홍보

204

2700

100

Steven

King

SKING

515.123.4567

2003-06-17

AD_PRES

24000.00

90

90

실행

100

1700

100

Steven

King

SKING

515.123.4567

2003-06-17

AD_PRES

24000.00

90

30

구매

114

1700

100

Steven

King

SKING

515.123.4567

2003-06-17

AD_PRES

24000.00

90

10

관리

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

배송

121

1500

100

Steven

King

SKING

515.123.4567

2003-06-17

AD_PRES

24000.00

90

40

인적 리소스

203

2400

알려진 문제

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

알 수 없는 국가

0

AR

아르헨티나

2

2

아메리카

AU

오스트레일리아

3

3

아시아

BE

벨기에

1

1

유럽

BR

브라질

2

2

아메리카

CA

캐나다

2

2

아메리카

CH

스위스

1

1

유럽

CN

중국

3

3

아시아

DE

독일

1

1

유럽

DK

덴마크

1

1

유럽

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

알 수 없는 국가

0.0000000000000000000

AR

아르헨티나

2.0000000000000000000

2.0000000000000000000

아메리카

AU

오스트레일리아

3.0000000000000000000

3.0000000000000000000

아시아

BE

벨기에

1.0000000000000000000

1.0000000000000000000

유럽

BR

브라질

2.0000000000000000000

2.0000000000000000000

아메리카

CA

캐나다

2.0000000000000000000

2.0000000000000000000

아메리카

CH

스위스

1.0000000000000000000

1.0000000000000000000

유럽

CN

중국

3.0000000000000000000

3.0000000000000000000

아시아

DE

독일

1.0000000000000000000

1.0000000000000000000

유럽

DK

덴마크

1.0000000000000000000

1.0000000000000000000

유럽

오른쪽 외부 조인 위치

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

오세아니아

ZW

짐바브웨

4

4

중동 및 아프리카

ZM

잠비아

4

4

중동 및 아프리카

US

미국

2

2

아메리카

UK

영국

1

1

유럽

SG

싱가포르

3

3

아시아

NL

네덜란드

1

1

유럽

NG

나이지리아

4

4

중동 및 아프리카

MX

멕시코

2

2

아메리카

ML

말레이시아

3

3

아시아

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

오세아니아

ZW

짐바브웨

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

ZM

잠비아

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

US

미국

2.0000000000000000000

2.0000000000000000000

아메리카

UK

영국

1.0000000000000000000

1.0000000000000000000

유럽

SG

싱가포르

3.0000000000000000000

3.0000000000000000000

아시아

NL

네덜란드

1.0000000000000000000

1.0000000000000000000

유럽

NG

나이지리아

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

MX

멕시코

2.0000000000000000000

2.0000000000000000000

아메리카

ML

말레이시아

3.0000000000000000000

3.0000000000000000000

아시아

전체 외부 조인 위치

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

알 수 없는 국가

0

5

오세아니아

EG

이집트

4

4

중동 및 아프리카

IL

이스라엘

4

4

중동 및 아프리카

KW

쿠웨이트

4

4

중동 및 아프리카

NG

나이지리아

4

4

중동 및 아프리카

ZM

잠비아

4

4

중동 및 아프리카

ZW

짐바브웨

4

4

중동 및 아프리카

BE

벨기에

1

1

유럽

CH

스위스

1

1

유럽

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

알 수 없는 국가

0.0000000000000000000

5.0000000000000000000

오세아니아

EG

이집트

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

IL

이스라엘

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

KW

쿠웨이트

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

NG

나이지리아

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

ZM

잠비아

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

ZW

짐바브웨

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

BE

벨기에

1.0000000000000000000

1.0000000000000000000

유럽

CH

스위스

1.0000000000000000000

1.0000000000000000000

유럽

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

알 수 없는 국가

2

AR

아르헨티나

아메리카

3

AU

오스트레일리아

아시아

1

BE

벨기에

유럽

2

BR

브라질

아메리카

2

CA

캐나다

아메리카

1

CH

스위스

유럽

3

CN

중국

아시아

1

DE

독일

유럽

1

DK

덴마크

유럽

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

알 수 없는 국가

2.0000000000000000000

AR

아르헨티나

아메리카

3.0000000000000000000

AU

오스트레일리아

아시아

1.0000000000000000000

BE

벨기에

유럽

2.0000000000000000000

BR

브라질

아메리카

2.0000000000000000000

CA

캐나다

아메리카

1.0000000000000000000

CH

스위스

유럽

3.0000000000000000000

CN

중국

아시아

1.0000000000000000000

DE

독일

유럽

1.0000000000000000000

DK

덴마크

유럽

자연 오른쪽 외부 조인

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

오세아니아

4

ZW

짐바브웨

중동 및 아프리카

4

ZM

잠비아

중동 및 아프리카

2

US

미국

아메리카

1

UK

영국

유럽

3

SG

싱가포르

아시아

1

NL

네덜란드

유럽

4

NG

나이지리아

중동 및 아프리카

2

MX

멕시코

아메리카

3

ML

말레이시아

아시아

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

오세아니아

4.0000000000000000000

ZW

짐바브웨

중동 및 아프리카

4.0000000000000000000

ZM

잠비아

중동 및 아프리카

2.0000000000000000000

US

미국

아메리카

1.0000000000000000000

UK

영국

유럽

3.0000000000000000000

SG

싱가포르

아시아

1.0000000000000000000

NL

네덜란드

유럽

4.0000000000000000000

NG

나이지리아

중동 및 아프리카

2.0000000000000000000

MX

멕시코

아메리카

3.0000000000000000000

ML

말레이시아

아시아

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

알 수 없는 국가

2

AR

아르헨티나

아메리카

3

AU

오스트레일리아

아시아

1

BE

벨기에

유럽

2

BR

브라질

아메리카

2

CA

캐나다

아메리카

1

CH

스위스

유럽

3

CN

중국

아시아

1

DE

독일

유럽

1

DK

덴마크

유럽

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

알 수 없는 국가

2.0000000000000000000

AR

아르헨티나

아메리카

3.0000000000000000000

AU

오스트레일리아

아시아

1.0000000000000000000

BE

벨기에

유럽

2.0000000000000000000

BR

브라질

아메리카

2.0000000000000000000

CA

캐나다

아메리카

1.0000000000000000000

CH

스위스

유럽

3.0000000000000000000

CN

중국

아시아

1.0000000000000000000

DE

독일

유럽

1.0000000000000000000

DK

덴마크

유럽

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

알 수 없는 국가

0

AR

아르헨티나

2

2

아메리카

AU

오스트레일리아

3

3

아시아

BE

벨기에

1

1

유럽

BR

브라질

2

2

아메리카

CA

캐나다

2

2

아메리카

CH

스위스

1

1

유럽

CN

중국

3

3

아시아

DE

독일

1

1

유럽

DK

덴마크

1

1

유럽

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

알 수 없는 국가

0.0000000000000000000

AR

아르헨티나

2.0000000000000000000

2.0000000000000000000

아메리카

AU

오스트레일리아

3.0000000000000000000

3.0000000000000000000

아시아

BE

벨기에

1.0000000000000000000

1.0000000000000000000

유럽

BR

브라질

2.0000000000000000000

2.0000000000000000000

아메리카

CA

캐나다

2.0000000000000000000

2.0000000000000000000

아메리카

CH

스위스

1.0000000000000000000

1.0000000000000000000

유럽

CN

중국

3.0000000000000000000

3.0000000000000000000

아시아

DE

독일

1.0000000000000000000

1.0000000000000000000

유럽

DK

덴마크

1.0000000000000000000

1.0000000000000000000

유럽

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

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

오세아니아

ZW

짐바브웨

4

4

중동 및 아프리카

ZM

잠비아

4

4

중동 및 아프리카

US

미국

2

2

아메리카

UK

영국

1

1

유럽

SG

싱가포르

3

3

아시아

NL

네덜란드

1

1

유럽

NG

나이지리아

4

4

중동 및 아프리카

MX

멕시코

2

2

아메리카

ML

말레이시아

3

3

아시아

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

오세아니아

ZW

짐바브웨

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

ZM

잠비아

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

US

미국

2.0000000000000000000

2.0000000000000000000

아메리카

UK

영국

1.0000000000000000000

1.0000000000000000000

유럽

SG

싱가포르

3.0000000000000000000

3.0000000000000000000

아시아

NL

네덜란드

1.0000000000000000000

1.0000000000000000000

유럽

NG

나이지리아

4.0000000000000000000

4.0000000000000000000

중동 및 아프리카

MX

멕시코

2.0000000000000000000

2.0000000000000000000

아메리카

ML

말레이시아

3.0000000000000000000

3.0000000000000000000

아시아

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

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

유럽

2000

40-5-12 Laogianggen

190518

베이징

CH

스위스

1

유럽

3000

Murtenstrasse 921

3095

베른

1

유럽

2100

1298 Vileparle (E)

490231

봄베이

CH

스위스

1

유럽

2900

20 Rue des Corps-Saints

1730

제네바

1

유럽

1300

9450 Kamiya-cho

6823

히로시마

UK

영국

1

유럽

2400

8204 Arthur St

런던

1

유럽

3200

Mariano Escobedo 9991

11932

멕시코 시티

DE

독일

1

유럽

2700

Schwanthalerstr. 7031

80925

뮌헨

UK

영국

1

유럽

2500

Magdalen Centre, The Oxford Science Park

OX9 9ZB

옥스퍼드

IT

이탈리아

1

유럽

1000

1297 Via Cola di Rie

00989

로마

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

유럽

2000

40-5-12 Laogianggen

190518

베이징

CH

스위스

1.0000000000000000000

유럽

3000

Murtenstrasse 921

3095

베른

1.0000000000000000000

유럽

2100

1298 Vileparle (E)

490231

봄베이

CH

스위스

1.0000000000000000000

유럽

2900

20 Rue des Corps-Saints

1730

제네바

1.0000000000000000000

유럽

1300

9450 Kamiya-cho

6823

히로시마

UK

영국

1.0000000000000000000

유럽

2400

8204 Arthur St

런던

1.0000000000000000000

유럽

3200

Mariano Escobedo 9991

11932

멕시코 시티

DE

독일

1.0000000000000000000

유럽

2700

Schwanthalerstr. 7031

80925

뮌헨

UK

영국

1.0000000000000000000

유럽

2500

Magdalen Centre, The Oxford Science Park

OX9 9ZB

옥스퍼드

IT

이탈리아

1.0000000000000000000

유럽

1000

1297 Via Cola di Rie

00989

로마

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

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

아메리카

3

아시아

Snowflake
SELECT * FROM
hr.regions r
WHERE
r.region_name LIKE 'A%'
ORDER BY region_id;
Copy
결과

REGION_ID

REGION_NAME

2.0000000000000000000

아메리카

3.0000000000000000000

아시아

알려진 문제

지원되지 않는 모든 사례에 대해서는 관련 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

유럽

2000

40-5-12 Laogianggen

190518

베이징

CN

CH

스위스

1

1

유럽

3000

Murtenstrasse 921

3095

베른

BE

CH

1

유럽

2100

1298 Vileparle (E)

490231

봄베이

마하라시트라

IN

CH

스위스

1

1

유럽

2900

20 Rue des Corps-Saints

1730

제네바

제네바

CH

1

유럽

1300

9450 Kamiya-cho

6823

히로시마

JP

UK

영국

1

1

유럽

2400

8204 Arthur St

런던

UK

1

유럽

3200

Mariano Escobedo 9991

11932

멕시코 시티

연방구,

MX

DE

독일

1

1

유럽

2700

Schwanthalerstr. 7031

80925

뮌헨

바이에른

DE

UK

영국

1

1

유럽

2500

Magdalen Centre, The Oxford Science Park

OX9 9ZB

옥스퍼드

옥스퍼드

UK

IT

이탈리아

1

1

유럽

1000

1297 Via Cola di Rie

00989

로마

IT

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

유럽

2000

40-5-12 Laogianggen

190518

베이징

CN

1.0000000000000000000

유럽

3000

Murtenstrasse 921

3095

베른

BE

CH

CH

스위스

1.0000000000000000000

1.0000000000000000000

유럽

2100

1298 Vileparle (E)

490231

봄베이

마하라시트라

IN

1.0000000000000000000

유럽

2900

20 Rue des Corps-Saints

1730

제네바

제네바

CH

CH

스위스

1.0000000000000000000

1.0000000000000000000

유럽

1300

9450 Kamiya-cho

6823

히로시마

JP

1.0000000000000000000

유럽

2400

8204 Arthur St

런던

UK

UK

영국

1.0000000000000000000

1.0000000000000000000

유럽

3200

Mariano Escobedo 9991

11932

멕시코 시티

연방구,

MX

1.0000000000000000000

유럽

2700

Schwanthalerstr. 7031

80925

뮌헨

바이에른

DE

DE

독일

1.0000000000000000000

1.0000000000000000000

유럽

2500

Magdalen Centre, The Oxford Science Park

OX9 9ZB

옥스퍼드

옥스퍼드

UK

UK

영국

1.0000000000000000000

1.0000000000000000000

유럽

1000

1297 Via Cola di Rie

00989

로마

IT

IT

이탈리아

1.0000000000000000000

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

유럽

2000

40-5-12 Laogianggen

190518

베이징

CN

1

유럽

3000

Murtenstrasse 921

3095

베른

BE

CH

1

유럽

2100

1298 Vileparle (E)

490231

봄베이

마하라시트라

IN

1

유럽

2900

20 Rue des Corps-Saints

1730

제네바

제네바

CH

1

유럽

1300

9450 Kamiya-cho

6823

히로시마

JP

1

유럽

2400

8204 Arthur St

런던

UK

1

유럽

3200

Mariano Escobedo 9991

11932

멕시코 시티

연방구,

MX

1

유럽

2700

Schwanthalerstr. 7031

80925

뮌헨

바이에른

DE

1

유럽

2500

Magdalen Centre, The Oxford Science Park

OX9 9ZB

옥스퍼드

옥스퍼드

UK

1

유럽

1000

1297 Via Cola di Rie

00989

로마

IT

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
결과

직원 및 해당 관리자

Rajs는 Mourgos에서 근무함

Raphaely는 King에서 근무함

Rogers는 Kaufling에서 근무함

Russell은 King에서 근무함

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
결과

직원 및 해당 관리자

Rajs는 Mourgos에서 근무함

Raphaely는 King에서 근무함

Rogers는 Kaufling에서 근무함

Russell은 King에서 근무함

참고

앞서 증명했듯이 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

회계

205

1700

10

관리

200

1700

90

실행

100

1700

100

Finance

108

1700

40

인적 리소스

203

2400

60

IT

103

1400

20

마케팅

201

1800

70

홍보

204

2700

30

구매

114

1700

80

Sales

145

2500

50

배송

121

1500

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

회계

205

1700

10

관리

200

1700

90

실행

100

1700

100

Finance

108

1700

40

인적 리소스

203

2400

60

IT

103

1400

20

마케팅

201

1800

70

홍보

204

2700

30

구매

114

1700

80

Sales

145

2500

50

배송

121

1500

참고

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

Known Issues

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

관련 EWIs

관련 EWIs 없음.