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
또한 주의할 점은 다음과 같습니다.(+)
Oracle에서는 사용하지 않는 것이 좋습니다.
Oracle은 다음 명령어를 사용하는 것을 추천합니다.
FROM
조문OUTER JOIN
Oracle 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
'programing' 카테고리의 다른 글
useState 훅 세터가 상태를 잘못 덮어씁니다. (0) | 2023.03.28 |
---|---|
jQuery Ajax가 iOS에서 작동하지 않음(list.js 포함) (0) | 2023.03.28 |
버튼과 같은 반응 구성요소에서 활성, 호버와 같은 복합 반응 인라인 스타일 설정 (0) | 2023.03.28 |
json: 개체를 형식의 Go 값으로 마킹 해제할 수 없습니다. (0) | 2023.03.28 |
워드프레스: 추가워드프레스: 추가 (0) | 2023.03.28 |