복붙노트

[SQL] 오라클 "(+)"운영자

SQL

오라클 "(+)"운영자

내가 그들을 문서화하고 아마를 강화하기위한 목적으로 오래된 SQL 문을 확인하고 있습니다.

DBMS를 오라클입니다

나는이처럼 읽을 성명을 이해하지 못했다 :

select ...
from a,b
where a.id=b.id(+)

나는 (+) 연산자에 대해 혼란 스러워요, 그것은 (중 하나가 작동하지 않았다 따옴표 + 검색) ... 어떤 포럼에서 가져올 수 없습니다.

어쨌든, 나는 SQLDeveloper의 '계획 설명'을 사용하고 그 HASH 말을 출력 가입, RIGHT OUTER 등을 가지고

내가 쿼리의 끝에서 (+) 연산자를 제거하면 어떤 차이가 있을까? 데이터베이스를 사용할 수있다 (+) 전 (일부 인덱스 등을 갖는 같은) 어떤 조건을 만족해야 하는가? 당신이 저에게 간단한 이해, 또는 나는 이것에 대해 읽을 수있는 좋은 링크를 제공 할 수있는 경우는 크게 도움이 될 것입니다.

감사!

해결법

  1. ==============================

    1.외부 조인에 대한 ANSI-89 형식은 외부 조인 표준화하지 않았다 (FROM 절에서 별도의 테이블 참조에에 쉼표를 사용하여) 때문에 즉, 오라클 특정 표기법입니다.

    외부 조인에 대한 ANSI-89 형식은 외부 조인 표준화하지 않았다 (FROM 절에서 별도의 테이블 참조에에 쉼표를 사용하여) 때문에 즉, 오라클 특정 표기법입니다.

    쿼리는 ANSI-92 구문으로 재 작성 될 것입니다 :

       SELECT ...
         FROM a
    LEFT JOIN b ON b.id = a.id
    

    이 링크 사이에 조인의 차이를 설명하는 꽤 좋다.

    또한도 (+)의 작품 불구하고, 오라클은 그것을 사용하지 않는 것이 좋습니다 주목해야한다 :

  2. ==============================

    2.제 (+) 연산자는 외부 조인 나타낸다. 일치가없는 경우에도 오라클은 여전히 ​​다른 측면에서 레코드를 반환 것으로이 방법은 가입 할 수 있습니다. 예를 들어 A와 B는 EMP와 부서이고, 당신이 다음 문은 그들이 부서에 할당 된 적이 있는지 여부를 모든 직원의 세부 사항을 반환하는 부서에 할당되지 않은 직원이 할 수있는 경우.

    제 (+) 연산자는 외부 조인 나타낸다. 일치가없는 경우에도 오라클은 여전히 ​​다른 측면에서 레코드를 반환 것으로이 방법은 가입 할 수 있습니다. 예를 들어 A와 B는 EMP와 부서이고, 당신이 다음 문은 그들이 부서에 할당 된 적이 있는지 여부를 모든 직원의 세부 사항을 반환하는 부서에 할당되지 않은 직원이 할 수있는 경우.

    select * from emp, dept where emp.dept_id=dept.dept_id(+)
    

    그래서 즉, (+)를 제거 중요도의 차이를 만들 수 있지만 당신은을 위해하지 통지 데이터에 따라하면서 수도!

  3. ==============================

    3.오라클에서 (+)의 조인에서 "옵션"테이블을 나타냅니다. , 쿼리에 따라서

    오라클에서 (+)의 조인에서 "옵션"테이블을 나타냅니다. , 쿼리에 따라서

    SELECT a.id, b.id, a.col_2, b.col_2, ...
    FROM a,b
    WHERE a.id=b.id(+)
    

    그것은 LEFT OUTER 테이블 '은'표 'B'의 가입입니다. 그것은 다른 측면 (선택 테이블 'B') 데이터가없는 경우 데이터를 손실하지 않고 'A'테이블의 모든 데이터를 반환합니다.

    동일한 쿼리에 대한 현대적인 표준 구문이 될 것이다

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    LEFT JOIN b ON a.id=b.id
    

    또는 a.id = b.id (모든 데이터베이스에서 지원되지 않음)에 대한 속기로 :

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    LEFT JOIN b USING(id)
    

    Oracle 및 다른 데이터베이스 모두에서 이전 구문 :

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a,b
    WHERE a.id=b.id
    

    현대 구문 :

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    INNER JOIN b ON a.id=b.id
    

    또는 단순히 :

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    JOIN b ON a.id=b.id
    

    그것은 모든 데이터 만 'A'및 'B'테이블 'ID'값이 동일하므로, 공통 부분 수단 모두를 리턴한다.

    왼쪽은 가입으로 이것은 단지 동일하지만, 어떤 테이블 스위치는 선택 사항입니다.

    올드 오라클 구문 :

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a,b
    WHERE a.id(+)=b.id
    

    현대 표준 문법 :

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    RIGHT JOIN b ON a.id=b.id
    

    https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187

    왼쪽 외부 오라클 11g에서 + 기호를 사용하여 가입

    https://www.w3schools.com/sql/sql_join_left.asp

  4. ==============================

    4.실제로, + 기호가 조건문과 옵션 테이블 (조건 내에서 빈 또는 null 값을 포함 할 수있는 하나)의 측면에 직접 배치된다.

    실제로, + 기호가 조건문과 옵션 테이블 (조건 내에서 빈 또는 null 값을 포함 할 수있는 하나)의 측면에 직접 배치된다.

  5. from https://stackoverflow.com/questions/4020786/oracle-operator by cc-by-sa and MIT license