[sql] 오라클“(+)”연산자

오래된 SQL 문을 문서화하고 향상시키기 위해 점검하고 있습니다.

DBMS는 Oracle입니다

나는 다음과 같은 문장을 이해하지 못했습니다.

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

(+)연산자 에 대해 혼란스러워 포럼에서 얻을 수 없었습니다 … (따옴표 내 + 검색도 작동하지 않았습니다).

어쨌든 SQLDeveloper의 ‘Explain Plan’을 사용했으며 다음과 같은 내용의 출력을 얻었습니다 HASH JOIN, RIGHT OUTER.

(+)쿼리가 끝날 때 연산자를 제거하면 차이가 있습니까? 데이터베이스를 (+)사용 하기 전에 몇 가지 조건 (예 : 인덱스 등)을 만족시켜야합니까 ? 간단한 이해 나 이것에 대해 읽을 수있는 좋은 링크를 제공해 주시면 큰 도움이 될 것입니다.

감사!

a


답변

FROM 절에서 쉼표를 사용하여 테이블 참조를 구분하는 ANSI-89 형식은 OUTER 조인을 표준화하지 않았기 때문에 OUTER JOIN에 대한 Oracle 고유 표기법입니다.

쿼리는 다음과 같이 ANSI-92 구문으로 다시 작성됩니다.

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

이 링크는 JOIN의 차이점을 잘 설명합니다 .


또한 (+)작동 하지만 Oracle은 사용 하지 않는 것이 좋습니다 .

Oracle 은 조인 연산자 대신 FROMOUTER JOIN구문 을 사용하는 것이 좋습니다 . Oracle 조인 연산자를 사용하는 외부 조인 쿼리 (+)에는 다음 규칙과 제한 사항이 적용 FROM되며이 OUTER JOIN구문 은 조항 구문에 적용되지 않습니다 .


답변

(+) 연산자는 외부 조인을 나타냅니다. 즉, Oracle은 일치하는 항목이 없더라도 조인의 다른 쪽에서 레코드를 계속 반환합니다. 예를 들어, a와 b가 비어 있고 부서에 직원을 할당하지 않은 경우 다음 명령문은 부서에 할당되었는지 여부에 관계없이 모든 직원의 세부 사항을 리턴합니다.

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

간단히 말해 (+)를 제거하면 유의미한 차이가 생길 수 있지만 데이터에 따라 잠시 동안 눈치 채지 못할 수도 있습니다!


답변

Oracle에서 (+)는 JOIN의 “선택적”테이블을 나타냅니다. 쿼리에서

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

테이블 ‘b’에서 테이블 ‘a’의 LEFT OUTER JOIN입니다. 다른 쪽 (옵션 테이블 ‘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’값이 동일한 모든 데이터 만 반환하며 공통 부분을 의미합니다.

쿼리를 올바른 조인으로 만들려면

이것은 LEFT JOIN과 동일하지만 어떤 테이블이 선택적인지 전환합니다.

오른쪽 외부 조인 다이어그램

기존 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
RIGHT JOIN b ON a.id=b.id

참조 및 도움말 :

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

Oracle 11g에서 + 부호를 사용하여 왼쪽 외부 조인

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


답변

실제로 + 기호는 조건문과 선택적 테이블 (조건부 내에 비어 있거나 널 (NULL) 값을 포함 할 수있는)의 측면에 직접 배치됩니다.


답변


댓글 달기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다