[SQL] 오라클 "(+)"운영자
SQL오라클 "(+)"운영자
내가 그들을 문서화하고 아마를 강화하기위한 목적으로 오래된 SQL 문을 확인하고 있습니다.
DBMS를 오라클입니다
나는이처럼 읽을 성명을 이해하지 못했다 :
select ...
from a,b
where a.id=b.id(+)
나는 (+) 연산자에 대해 혼란 스러워요, 그것은 (중 하나가 작동하지 않았다 따옴표 + 검색) ... 어떤 포럼에서 가져올 수 없습니다.
어쨌든, 나는 SQLDeveloper의 '계획 설명'을 사용하고 그 HASH 말을 출력 가입, RIGHT OUTER 등을 가지고
내가 쿼리의 끝에서 (+) 연산자를 제거하면 어떤 차이가 있을까? 데이터베이스를 사용할 수있다 (+) 전 (일부 인덱스 등을 갖는 같은) 어떤 조건을 만족해야 하는가? 당신이 저에게 간단한 이해, 또는 나는 이것에 대해 읽을 수있는 좋은 링크를 제공 할 수있는 경우는 크게 도움이 될 것입니다.
감사!
해결법
-
==============================
1.외부 조인에 대한 ANSI-89 형식은 외부 조인 표준화하지 않았다 (FROM 절에서 별도의 테이블 참조에에 쉼표를 사용하여) 때문에 즉, 오라클 특정 표기법입니다.
외부 조인에 대한 ANSI-89 형식은 외부 조인 표준화하지 않았다 (FROM 절에서 별도의 테이블 참조에에 쉼표를 사용하여) 때문에 즉, 오라클 특정 표기법입니다.
쿼리는 ANSI-92 구문으로 재 작성 될 것입니다 :
SELECT ... FROM a LEFT JOIN b ON b.id = a.id
이 링크 사이에 조인의 차이를 설명하는 꽤 좋다.
또한도 (+)의 작품 불구하고, 오라클은 그것을 사용하지 않는 것이 좋습니다 주목해야한다 :
-
==============================
2.제 (+) 연산자는 외부 조인 나타낸다. 일치가없는 경우에도 오라클은 여전히 다른 측면에서 레코드를 반환 것으로이 방법은 가입 할 수 있습니다. 예를 들어 A와 B는 EMP와 부서이고, 당신이 다음 문은 그들이 부서에 할당 된 적이 있는지 여부를 모든 직원의 세부 사항을 반환하는 부서에 할당되지 않은 직원이 할 수있는 경우.
제 (+) 연산자는 외부 조인 나타낸다. 일치가없는 경우에도 오라클은 여전히 다른 측면에서 레코드를 반환 것으로이 방법은 가입 할 수 있습니다. 예를 들어 A와 B는 EMP와 부서이고, 당신이 다음 문은 그들이 부서에 할당 된 적이 있는지 여부를 모든 직원의 세부 사항을 반환하는 부서에 할당되지 않은 직원이 할 수있는 경우.
select * from emp, dept where emp.dept_id=dept.dept_id(+)
그래서 즉, (+)를 제거 중요도의 차이를 만들 수 있지만 당신은을 위해하지 통지 데이터에 따라하면서 수도!
-
==============================
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.실제로, + 기호가 조건문과 옵션 테이블 (조건 내에서 빈 또는 null 값을 포함 할 수있는 하나)의 측면에 직접 배치된다.
실제로, + 기호가 조건문과 옵션 테이블 (조건 내에서 빈 또는 null 값을 포함 할 수있는 하나)의 측면에 직접 배치된다.
from https://stackoverflow.com/questions/4020786/oracle-operator by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] CONCATENATE / 집계 문자열에 최적의 방법 (0) | 2020.03.14 |
---|---|
[SQL] MySQL은 NULL (성능 및 스토리지) (0) | 2020.03.14 |
[SQL] PostgreSQL의 쿼리에 변수를 선언하는 방법 (0) | 2020.03.14 |
[SQL] SQL Server의 LIMIT 10 ... 20 (0) | 2020.03.14 |
[SQL] 오라클에서 테이블에서 중복 행을 제거 (0) | 2020.03.14 |