Oracle의 더하기 (+) 표기법과 ANSI JOIN 표기법의 차이점은 무엇입니까?
(+)
ANSI 표준 join
표기법 보다 오라클의 플러스 표기법 을 사용하는 것의 차이점은 무엇입니까 ?
성능에 차이가 있습니까?
더하기 표기법이 더 이상 사용하지 않습니까?
AFAIK,이 (+)
표기법은 조인에 대한 ANSI 표준이 제자리에 놓이기 전에 Oracle이 데뷔 때문에 이전 버전과의 위해서만 존재합니다. 이는 Oracle에만 해당하는 경우 동등한 표준 준수 버전을 사용할 수있는 새 코드에서 사용하지 않습니다.
둘 사이에 차이점이있는 것 같고 (+)
표기법에는 ANSI 조인 구문에없는 제한이 있습니다. 오라클은 (+)
표기법을 사용하지 않는 것이 좋습니다 . Oracle® Database SQL Language Reference 11g Release 1 (11.1)의 전체 설명 :
Oracle 은 Oracle 조인 연산자보다
FROM
절OUTER JOIN
구문 을 사용하는 것이 좋습니다. 오라클 연산자를 사용 조인하는 외부 조인 쿼리(+)
에는FROM
절OUTER JOIN
구문에 적용되지 않는 다음 규칙 및 제한 사항이 적용됩니다 .
- 절 조인 구문
(+)
도 포함하는 쿼리 블록 에서는 연산자를 수 없습니다FROM
.(+)
오퍼레이터 만 나타날 수WHERE
절이나 많은 상관의 시나리오 (시방 때에TABLE
절)FROM
절 및 표 또는 뷰의 열에 만 적용 할 수있다.- A와 B가 여러 경우 조인 조건으로 조인되는
(+)
경우 모든 조건에서 연산자를 사용합니다 . Oracle Database는 단순 조인의 결과 행만 반환하지만 외부 조인의 결과가 표시되지 않습니다.(+)
당신이 내부 쿼리에서 외부 쿼리와 다른 테이블에서 하나의 테이블을 지정하면 외부를 생성하지 않습니다.(+)
자체 조인은 유효하지만 연산자를 사용하여 테이블을 외부 조인 할 수 없습니다 .예를 들어 다음 문은 유효하지 않습니다.
SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id;
그러나 다음 자체 조인은 유효합니다.
SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id;
(+)
오퍼레이터는 임의의 표현이 아닌 영역에 적용 할 수 있습니다. 그러나 임의의 도구는(+)
연산자 로 하나 이상의 열을 포함 할 수 있습니다 .WHERE
포함하는 조건(+)
연산자는 다른 사용 조건과 결합이 될 수없는OR
논리 연산자입니다.WHERE
조건은 사용할 수IN
없는 것 열 비교하는 비교 조건을(+)
식으로 오퍼레이터.
WHERE
절에 테이블 B 열을 상수의와 비교하는보기 조건이 포함 된 경우(+)
오라클 이이 열에 대해 널 (null)을 생성 한 테이블의 행을 반환하도록 연산자를 열에 적용해야합니다 . 개체는 Oracle은 단순 조인의 결과 만 반환합니다.두 개 이상의 테이블의 외부 조인을 수행하는 쿼리에서 단일 테이블은 하나의 다른 테이블에 Null 생성 테이블이 될 수 있습니다.
(+)
따라서 A와 B의 조인 조건과 B와 C의 조인 조건에서는 B의 열에 연산자를 적용 할 수 없습니다SELECT
. 외부 조인 구문 은를 참조하십시오 .
표기법은 Oracle 10부터 여전히 지원됩니다 (11을 믿습니다). 사용은 "구식"으로 그리고 ANSI JOIN 구문만큼 데이터베이스 이식성이 없습니다. + 배경에서 온 경우 ANSI JOIN에 익숙해지는 데 데의 시간이 좀 더 간단하게 읽을 수 있습니다. 오라클에서 브릭 뱃을 던지기 전에 알아야 할 중요한 사항은 ANSI위원회가 조인에 대한 정의를 완료하기 + 구문을 개발하기 전에 것입니다.
성능 차이는 없습니다. 같은 것을 표현하고 있습니다.
편집 : "이동식이 아님"으로 "오직 Oracle SQL에서만 지원"이라고 말 했어야합니다.
Tony Miller의 답변에 동의하며 (+) synthax로 할 수없는 몇 가지 사항도 추가하고 싶습니다.
- 두 테이블을 FULL OUTER JOIN 할 수 없습니다. UNION ALL 두 조인을 사용하여 수동으로 수행해야합니다.
- 둘 이상의 테이블에 테이블을 OUTER JOIN 할 수 없습니다. 수동으로 하위 쿼리를 호출합니다 (예 :
b.id = a.id (+) AND c.id = a.id (+)
허용되는 절이 아님).
가장 대답 인 대답은 당연히 nagul의 대답 입니다.
ANSI 구문에 대한 빠른 번역 / 매핑을 원하는 사람들을위한 추가 사항 :
--
-- INNER JOIN
--
SELECT *
FROM EMP e
INNER JOIN DEPT d ON d.DEPTNO = e.DEPTNO;
-- Synonym in deprecated oracle (+) syntax
SELECT *
FROM EMP e,
DEPT d
WHERE d.DEPTNO = e.DEPTNO;
--
-- LEFT OUTER JOIN
--
SELECT *
FROM EMP e
LEFT JOIN DEPT d ON d.DEPTNO = e.DEPTNO;
-- Synonym in deprecated oracle (+) syntax
SELECT *
FROM EMP e,
DEPT d
WHERE d.DEPTNO (+) = e.DEPTNO;
--
-- RIGHT OUTER JOIN
--
SELECT *
FROM EMP e
RIGHT JOIN DEPT d ON d.DEPTNO = e.DEPTNO;
-- Synonym in deprecated oracle (+) syntax
SELECT *
FROM EMP e,
DEPT d
WHERE d.DEPTNO = e.DEPTNO(+);
--
-- CROSS JOIN
--
SELECT *
FROM EMP e
CROSS JOIN DEPT d;
-- Synonym in deprecated oracle (+) syntax
SELECT *
FROM EMP e,
DEPT d;
--
-- FULL JOIN
--
SELECT *
FROM EMP e
FULL JOIN DEPT d ON d.DEPTNO = e.DEPTNO;
-- Synonym in deprecated oracle (+) syntax !NOT WORKING!
SELECT *
FROM EMP e,
DEPT d
WHERE d.DEPTNO (+) = e.DEPTNO(+);
이전 Oracle 조인 구문 에 대해 ANSI 구문 을 사용하는 좋은 이유 중 하나는 실수로 데카르트 곱을 만들 가능성이 없다는 것 입니다. 테이블 수가 많을수록 이전 Oracle 조인 구문과 의 암시 적 조인 을 놓칠 가능성이 있지만 ANSI 구문에서는 명시 적으로 언급 해야하므로 조인을 놓칠 수 없습니다 .
Oracle 외부 조인 구문 과 ANSI / ISO 구문의 차이점 .
LEFT OUTER JOIN-
SELECT e.last_name,
d.department_name
FROM employees e,
departments d
WHERE e.department_id = d.department_id(+);
SELECT e.last_name,
d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id);
오른쪽 외부 조인-
SELECT e.last_name,
d.department_name
FROM employees e,
departments d
WHERE e.department_id(+) = d.department_id;
SELECT e.last_name,
d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id);
전체 외부 조인-
11gR1에서 해시 전체 외부 조인을 기본 지원하기 전에 Oracle은 내부적으로 FULL OUTER JOIN을 다음과 같이 변환합니다.
SELECT e.last_name,
d.department_name
FROM employees e,
departments d
WHERE e.department_id = d.department_id(+)
UNION ALL
SELECT NULL,
d.department_name
FROM departments d
WHERE NOT EXISTS
(SELECT 1 FROM employees e WHERE e.department_id = d.department_id
);
SELECT e.last_name,
d.department_name
FROM employees e
FULL OUTER JOIN departments d
ON (e.department_id = d.department_id);
이것 좀보세요 .
Oracle (+) 표기법 은 공급 업체별 Oracle에서만 사용됩니다 . 그리고 ANSI 표준 조인 표기법 은 모든 RDBMS (Sql Server, MySql 등)에서 사용할 수 있습니다 . 그렇지 않으면 Oracle (+) 표기법과 ANSI 표준 조인 표기법간에 차이가 없습니다.
SQL 쿼리에서 ANSI 표준 조인 표기법을 사용하는 경우 모든 RDBMS에서 동일한 쿼리를 사용할 수 있습니다. 그리고 해당 조건 에서 Oracle에서 다른 RDBMS 로 데이터베이스 를 이식 하는 경우 ANSI 구문 을 사용해야합니다 .
거의 모든 Oracle Apps r12 관련 쿼리가이를 기반으로하기 때문에 (+) 표기법을 사용합니다. Oracle APPS 쿼리 (오라클 자체에서 제공하는 쿼리 포함)에서 표준 "조인"표현식을 사용하는 단일 SQL 쿼리를 본 적이 없습니다. 저를 믿지 않으시면 오라클 앱 관련 정보를 검색해보십시오. 예 : 고정 자산 관련 쿼리
- 암시 적 (외부 조인인지 여부에 관계없이) 암시 적보다는 명시 적 조인을 사용하면 암시 적 조인으로 카티 전 곱을 실수로 만드는 것이 훨씬 쉽습니다. 명시 적 JOIN을 사용하면 "실수로"만들 수 없습니다. 더 많은 테이블이 포함 될수록 하나의 조인 조건을 놓칠 위험이 높아집니다.
- 기본적으로 (+)는 ANSI 조인에 비해 심각하게 제한됩니다. 또한 ANSI 조인 구문은 모든 주요 DBMS에서 지원되는 반면 Oracle에서만 사용할 수 있습니다.
- SQL은 ANSI 구문으로 마이그레이션 한 후 더 나은 성능을 발휘하지 못합니다. 단지 다른 구문 일뿐입니다.
- Oracle은 앞의 예에 표시된보다 유연한 FROM 절 조인 구문을 사용하는 것이 좋습니다. 과거에는 ANSI 구문에 몇 가지 버그가 있었지만 최신 11.2 또는 12.1을 사용하는 경우 이미 수정되어야합니다.
- JOIN 연산자를 사용하면 SQL 코드가 ANSI와 호환되므로 프런트 엔드 응용 프로그램을 다른 데이터베이스 플랫폼에 더 쉽게 이식 할 수 있습니다.
- 조인 조건은 각 테이블의 선택도가 매우 낮고 이론적 외적의 튜플에 대한 선택도가 높습니다. where 문의 조건은 일반적으로 훨씬 더 높은 선택성을 갖습니다.
- Oracle은 내부적으로 ANSI 구문을 (+) 구문으로 변환합니다. 실행 계획의 Predicate Information 섹션에서 이러한 상황을 확인할 수 있습니다.
'ProgramingTip' 카테고리의 다른 글
모든 코드 위치가 독립적이지 않은 이유는 무엇입니까? (0) | 2020.10.29 |
---|---|
왜 vertical-align : text-top; (0) | 2020.10.29 |
htaccess는 기본 인증에서 하나의 URL을 제외합니다. (0) | 2020.10.29 |
항아리 불일치! (0) | 2020.10.29 |
Xcode 8 : 함수 유형은 내 빌드를 깨는 인수를 생산할 수 없습니다. (0) | 2020.10.29 |