Oracle 더하기(+) 표기법과 ANSI JOIN 표기법의 차이점
표기법을 과 어떤 가 있습니까?(+)
join
★★★★★★★★★★★★★★★★★?
성능 차이가 있습니까?
플러스 표기법은 폐지되었습니까?
AFAIK,(+)
표기법은 Join에 대한 ANSI 표준이 마련되기 전에 Oracle에서 처음 공개되었기 때문에 하위 호환성에 대해서만 존재합니다.이는 Oracle에만 해당되므로 동등한 표준 준수 버전을 사용할 수 있는 경우 새 코드에서 사용하지 않도록 해야 합니다.
가지 가 있는 것 .(+)
ANSI 가입는 Oracle을 하지 않는 것이 .(+)
표기법자세한 내용은 Oracle® Database SQL Language Reference 11g Release 1(11.1):
에서는 Oracle을 .
FROM
조 clauseOUTER JOIN
오라클에 가입하다 연산자 join을 하는(+)
에는 다음과 규칙되며, 이 및 제한은 are음음음 are음음음음음음음 the the the the 에는 적용되지 않습니다.FROM
조 clauseOUTER JOIN
★★★★
- 경우 할 수 .
(+)
('Da't''to'to 'Da't'to'to 'Da't'to'를 포함)FROM
join 가입하다(+)
는 '연산자'에만 표시될 수 있습니다.WHERE
(''를 ) 절TABLE
에 기재되어 .FROM
명령어는 viewdisplay의 할 수 . 테이블 또는 뷰의 열에만 적용할 수 있습니다.- 조건으로 경우 A' B'를 .
(+)
오퍼레이터가 필요합니다.그렇지 않으면 Oracle Database는 단순 조인 결과 행만 반환하고 외부 조인 결과가 없음을 알리는 경고나 오류는 없습니다.(+)
외부 쿼리에서 테이블 하나를 지정하고 내부 쿼리에서 다른 테이블을 지정하면 연산자가 외부 조인(join)을 생성하지 않습니다.- 하실 수 없습니다.
(+)
.예를 들어, 다음 문장은 유효하지 않습니다.
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;
(+)
연산자는 열에만 적용할 수 있으며 임의 식에는 적용할 수 없습니다.의 컬럼을 할 수 .(+)
교환입니다.- A
WHERE
를 포함하는 상태(+)
연산자는 를 사용하여 다른 조건과 결합할 수 없습니다.OR
논리 연산자- A
WHERE
조건에서는IN
비교 조건을 사용하여 표시된 열을 비교합니다.(+)
연산자로 표현합니다.경우,
WHERE
되어 있습니다. 테이블 B의 컬럼과 상수가 비교됩니다.(+)
Oracle이 이 열에 대해 null을 생성한 테이블 A의 행을 반환하도록 연산자를 열에 적용해야 합니다.오라클3개 이상의 테이블쌍의 외부 조인을 실행하는 쿼리에서 단일 테이블은 다른 1개의 테이블에 대해서만 null로 생성된 테이블이 될 수 있습니다.때문에 하다, 하다, 하다, 하다, 할 수 없습니다.
(+)
A와 B의 결합 조건과 B와 C의 결합 조건의 B열에 연산자를 연결합니다.를 참조해 주세요.SELECT
외부 조인 구문을 지정합니다.
가장 포괄적인 대답은 분명히 나굴의 대답이다.
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 10(및 11) 시점에서도 지원되고 있습니다.이 방법은 "구식"으로 간주되며 ANSI JOIN 구문만큼 데이터베이스 이식성도 높지 않습니다.또한 가독성이 훨씬 떨어지는 것으로 간주되지만, + 배경의 사용자라면 ANSI JOIN에 익숙해지는 데 시간이 걸릴 수 있습니다.Oracle에 brickbats를 던지기 전에 알아야 할 중요한 것은 ANSI 위원회가 조인 정의를 완료하기 전에 + 구문을 개발했다는 것입니다.
퍼포먼스 차이는 없습니다.같은 것을 표현하고 있습니다.
편집: "휴대성이 높지 않습니다"라고 하면 "Oracle SQL에서만 지원됩니다"라고 말해야 합니다.
Tony Miller의 답변에 동의하며 (+) Synthax에서는 할 수 없는 몇 가지 작업도 추가하고자 합니다.
- 2개의 테이블을 풀 아우터 조인할 수 없습니다.두 개의 조인 UNION ALL을 사용하여 수동으로 해야 합니다.
- JOIN할 수 「」를 가 있습니다. 수동으로 하위 쿼리를 작성해야 합니다(즉,
b.id = a.id (+) AND c.id = a.id (+)
허용 조항이 아닙니다.)
이전 Oracle join 구문보다 ANSI 구문을 사용하는 좋은 이유 중 하나는 실수로 데카르트 제품이 생성될 가능성이 전혀 없기 때문입니다.테이블 수가 많을수록 이전 Oracle join 구문을 사용하는 암묵적인 조인을 놓칠 수 있지만 ANSI 구문을 사용하는 경우 명시적으로 언급해야 하므로 조인을 놓칠 수 없습니다.
Oracle 외부 결합 구문과 ANSI/ISO 구문 간의 차이점.
좌측 외측 결합 -
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 구문을 사용해야 합니다.
- (외부 조인이든 아니든) 암묵적인 조인이 아닌 명시적인 조인을 사용하면 암묵적인 조인을 사용하여 실수로 데카르트 제품을 작성하기 쉬워집니다.명시적 JOIN을 사용하면 "실수로" 생성할 수 없습니다.관련된 테이블이 많을수록 가입 조건이1개 누락될 위험이 높아집니다.
- 기본적으로 (+)는 ANSI Join에 비해 크게 제한됩니다.또한 ANSI join 구문은 모든 주요 DBMS에서 지원되는 반면 Oracle에서만 사용할 수 있습니다.
- SQL은 ANSI 구문으로의 이행 후 성능이 향상되지 않습니다.구문이 다를 뿐입니다.
- Oracle은 앞의 예에 나와 있는 보다 유연한 FROM 절 join 구문을 사용할 것을 강력히 권장합니다.과거에는 ANSI 구문을 사용하는 버그가 있었지만, 최신 11.2 또는 12.1을 사용하는 경우는 이미 수정이 끝난 상태여야 합니다.
- JOIN 연산자를 사용하면 SQL 코드가 ANSI에 준거하고 있는지 확인할 수 있으므로 프론트 엔드 애플리케이션을 다른 데이터베이스 플랫폼으로 보다 쉽게 이식할 수 있습니다.
- 결합 조건은 각 테이블에서 선택성이 매우 낮고 이론적 교차곱에서 튜플에서 선택성이 높습니다.여기서 스테이트먼트의 조건은 보통 선택성이 훨씬 높아집니다.
- Oracle은 내부적으로 ANSI 구문을 (+) 구문으로 변환하며, 실행 계획의 술어 정보 섹션에서 이러한 현상을 확인할 수 있습니다.
Oracle Apps r12 관련 쿼리는 거의 모두 이를 기반으로 하기 때문에 (+) 표기법을 사용합니다.Oracle APPS 쿼리에서 표준 "join" 표현식을 사용하는 SQL 쿼리는 단 한 개도 본 적이 없습니다(Oracle 자체에서 제공하는 쿼리도 마찬가지).믿을 수 없다면 Oracle 앱 관련 정보를 검색하기만 하면 됩니다.예: 고정 자산 관련 쿼리
언급URL : https://stackoverflow.com/questions/1193654/difference-between-oracles-plus-notation-and-ansi-join-notation
'programing' 카테고리의 다른 글
기능 구성요소의 기능은 어디로 이동해야 합니까? (0) | 2023.03.08 |
---|---|
AngualrJ: html 갱신 시 데이터 유지 (0) | 2023.03.08 |
반응 - 여러 참조 전달 (0) | 2023.03.08 |
json을 사용하여 복잡한 유형을 ASP에 전달하는 방법.NET MVC 컨트롤러 (0) | 2023.03.08 |
스프링 주석 @Controller는 @Service와 동일합니까? (0) | 2023.03.03 |