programing

Oracle 더하기(+) 표기법과 ANSI JOIN 표기법의 차이점

starjava 2023. 3. 8. 20:31
반응형

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'를 포함)FROMjoin 가입하다
  • (+)는 '연산자'에만 표시될 수 있습니다.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 구문을 사용해야 합니다.

  1. (외부 조인이든 아니든) 암묵적인 조인이 아닌 명시적인 조인을 사용하면 암묵적인 조인을 사용하여 실수로 데카르트 제품을 작성하기 쉬워집니다.명시적 JOIN을 사용하면 "실수로" 생성할 수 없습니다.관련된 테이블이 많을수록 가입 조건이1개 누락될 위험이 높아집니다.
  2. 기본적으로 (+)는 ANSI Join에 비해 크게 제한됩니다.또한 ANSI join 구문은 모든 주요 DBMS에서 지원되는 반면 Oracle에서만 사용할 수 있습니다.
  3. SQL은 ANSI 구문으로의 이행 후 성능이 향상되지 않습니다.구문이 다를 뿐입니다.
  4. Oracle은 앞의 예에 나와 있는 보다 유연한 FROM 절 join 구문을 사용할 것을 강력히 권장합니다.과거에는 ANSI 구문을 사용하는 버그가 있었지만, 최신 11.2 또는 12.1을 사용하는 경우는 이미 수정이 끝난 상태여야 합니다.
  5. JOIN 연산자를 사용하면 SQL 코드가 ANSI에 준거하고 있는지 확인할 수 있으므로 프론트 엔드 애플리케이션을 다른 데이터베이스 플랫폼으로 보다 쉽게 이식할 수 있습니다.
  6. 결합 조건은 각 테이블에서 선택성이 매우 낮고 이론적 교차곱에서 튜플에서 선택성이 높습니다.여기서 스테이트먼트의 조건은 보통 선택성이 훨씬 높아집니다.
  7. 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

반응형