programing

Oracle (+) 연산자

starjava 2023. 3. 28. 20:32
반응형

Oracle (+) 연산자

몇 가지 오래된 SQL 문을 확인하고 문서화하고 있습니다.

DBMS는 Oracle입니다.

나는 다음과 같은 문구를 이해하지 못했다.

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

나는 이 일에 대해 혼란스럽습니다.(+)오퍼레이터, 어떤 포럼에서도 취득할 수 없었습니다.(따옴표 안의 +도 사용할 수 없었습니다).

아무튼 SQLDeveloper의 'Explain Plan'을 사용했는데 결과물이 나왔습니다.HASH JOIN, RIGHT OUTER,기타.

이 버팀목을 제거해도 차이가 있나요?(+)연산자는 쿼리 끝에 있습니까?데이터베이스가 어떤 조건(인덱스 등)을 충족해야 합니까?(+)사용할 수 있습니까?

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

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

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

이 링크는 JOIN의 차이를 잘 설명해 줍니다.


또한 주의할 점은 다음과 같습니다.(+)Oracle에서는 사용하지 않는 것이 좋습니다.

Oracle은 다음 명령어를 사용하는 것을 추천합니다.FROM조문OUTER JOINOracle join 연산자가 아닌 구문을 사용합니다.Oracle join 연산자를 사용하는 외부 join 쿼리(+)에는 적용되지 않는 다음 규칙 및 제한사항이 적용됩니다.FROM조문OUTER JOIN구문:

Oracle에서 (+)는 JOIN의 "옵션" 테이블을 나타냅니다.그래서 당신의 질문에서,

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

테이블 'b'와 테이블 'a'의 좌측 아우터 결합입니다.상대편(옵션 테이블 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

(+) 연산자는 외부 결합을 나타냅니다.즉, Oracle은 일치하지 않는 경우에도 가입 반대쪽에서 레코드를 반환합니다.예를 들어, a와 b가 emp 및 dept이고 직원이 부서에 할당되지 않은 경우 다음 명령문은 해당 부서에 할당되었는지 여부에 관계없이 모든 직원의 세부 정보를 반환합니다.

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

즉, (+)를 제거하면 큰 차이가 날 수 있지만 데이터에 따라서는 한동안 알아차리지 못할 수도 있습니다.

실제로 + 기호는 조건문에 직접 배치되어 옵션테이블(조건부 내에 빈 값 또는 늘 값을 포함할 수 있는 테이블) 옆에 배치됩니다.

언급URL : https://stackoverflow.com/questions/4020786/oracle-operator

반응형