복붙노트

[SQL] 오라클은 조인 - 비교를 기존의 구문 VS ANSI 구문 사이

SQL

오라클은 조인 - 비교를 기존의 구문 VS ANSI 구문 사이

전문

후반, 나는 너무 많은 괴짜 "(+) 연산자를 사용하지 마십시오, 오히려 사용 JOIN 구문을"말하는 오라클 질문에 대한 주석을 참조하십시오.

질문

그 모두 일을 잘 볼 수 없습니다. 그러나 그들을 사용하고 당신이 그들을 사용하여 무엇을 느끼게 사이의 진정한 차이는 무엇인가? 나는 더 많은 경험에서 답변을 환영합니다.

 1. Is there anything to do with limitations in application, performance, 
    etc. while using them?

 2. What would you suggest for me?

나는 Oracle 설명서에 뭔가하지만 나를 이해하거나 포괄적 인 정보를 편안하지 충분한 읽었다.

참고 : 키워드가 대신 사용되어야하는 경우 나, 200 개 패키지 및 절차를 마이그레이션 할 계획입니다 (+)

  3. Also is there any freeware tools to do the rewrite?

게시 샘플

┌───────────────────────────────────┬─────────────────────────────────────────────┐
│ INNER JOIN - CONVENTIONAL         │ INNER JOIN - ANSI SYNTAX                    │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ SELECT                            │ SELECT                                      │
│      emp.deptno                   │       ename,                                │
│ FROM                              │       dname,                                │
│      emp,                         │       emp.deptno,                           │
│      dept                         │       dept.deptno                           │
│ WHERE                             │ FROM                                        │
│      emp.deptno = dept.deptno;    │       scott.emp INNER JOIN scott.dept       │
│                                   │       ON emp.deptno = dept.deptno;          │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ LEFT OUTER JOIN - CONVENTIONAL    │ LEFT OUTER JOIN - ANSI SYNTAX               │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ SELECT                            │ SELECT                                      │
│      emp.deptno                   │      ename,                                 │
│ FROM                              │      dname,                                 │
│      emp,                         │      emp.deptno,                            │
│      dept                         │      dept.deptno                            │
│ WHERE                             │ FROM                                        │
│      emp.deptno = dept.deptno(+); │      scott.emp LEFT OUTER JOIN scott.dept   │
│                                   │      ON emp.deptno = dept.deptno;           │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ RIGHT OUTER JOIN - CONVENTIONAL   │ RIGHT OUTER JOIN - ANSI SYNTAX              │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ SELECT                            │ SELECT                                      │
│      emp.deptno                   │      ename,                                 │
│ FROM                              │      dname,                                 │
│      emp,                         │      emp.deptno,                            │
│      dept                         │      dept.deptno                            │
│ WHERE                             │ FROM                                        │
│      emp.deptno(+) = dept.deptno; │      scott.emp RIGHT OUTER JOIN scott.dept  │
│                                   │      ON emp.deptno = dept.deptno;           │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ FULL OUTER JOIN - CONVENTIONAL    │ FULL OUTER JOIN - ANSI SYNTAX               │
├───────────────────────────────────┼─────────────────────────────────────────────┤
│ SELECT                            │ SELECT                                      │
│      *                            │      *                                      │
│ FROM                              │ FROM                                        │
│      emp,                         │      scott.emp FULL OUTER JOIN scott.dept   │
│      dept                         │      ON emp.deptno = dept.deptno;           │
│ WHERE                             │                                             │
│      emp.deptno = dept.deptno(+)  │                                             │
│ UNION ALL                         │                                             │
│ SELECT                            │                                             │
│      *                            │                                             │
│ FROM                              │                                             │
│      emp,                         │                                             │
│      dept                         │                                             │
│ WHERE                             │                                             │
│      emp.deptno(+) = dept.deptno  │                                             │
│      AND emp.deptno IS NULL;      │                                             │
└───────────────────────────────────┴─────────────────────────────────────────────┘

추신 : 그룹화 된 모든 업데이트에 대한 답변의 요약을 읽어보십시오.

해결법

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

    1."구식"구문을 사용하여 의도 한대로 당신의 200 개 이상의 패키지가 작업하는 경우가있을 수 있습니다. SQL은 ANSI 구문 마이그레이션 후 더 잘 수행하기 시작되지 않습니다 - 그것은 단지 다른 구문입니다. 모든 존재는 ANSI 구문은 깨끗했다 - 일부 다중 열 외부 조인을에 (+)를 잊어 버린 경우 당신은 정상에 조인하지 않을 수 있습니다.  과거에는이 ANSI 구문을 몇 가지 버그했다하지만 당신은 최신 11.2 또는 12.1에 가면 이미 고정되어야한다. SchmitzIT 말했듯이 - - ANSI 구문은 SQL 표준의 일부이며 다른 RDBMS 제품을 사용하려고 할 때 도움이 될 물론, 당신은 당신의 환경과 우선 순위 잘 알고있다.

    "구식"구문을 사용하여 의도 한대로 당신의 200 개 이상의 패키지가 작업하는 경우가있을 수 있습니다. SQL은 ANSI 구문 마이그레이션 후 더 잘 수행하기 시작되지 않습니다 - 그것은 단지 다른 구문입니다. 모든 존재는 ANSI 구문은 깨끗했다 - 일부 다중 열 외부 조인을에 (+)를 잊어 버린 경우 당신은 정상에 조인하지 않을 수 있습니다.  과거에는이 ANSI 구문을 몇 가지 버그했다하지만 당신은 최신 11.2 또는 12.1에 가면 이미 고정되어야한다. SchmitzIT 말했듯이 - - ANSI 구문은 SQL 표준의 일부이며 다른 RDBMS 제품을 사용하려고 할 때 도움이 될 물론, 당신은 당신의 환경과 우선 순위 잘 알고있다.

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

    2.11g에서는 ANSI JOIN 구문을 사용한다. 그것이 유연 (완전 외부 지원 조인 조인 분할)하고, 문서와 같은 상태 :

    11g에서는 ANSI JOIN 구문을 사용한다. 그것이 유연 (완전 외부 지원 조인 조인 분할)하고, 문서와 같은 상태 :

    그 이유는 충분하다.

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

    3.함께 답변을 그룹화

    함께 답변을 그룹화

    가능한 함정 12C 엔진에 ANSI 구문을 사용하여에

    버그의 가능성을 포함에서 12C에 가입하세요. 여기를 보아라

    후속 :

    퀘스트 SQL 최적화 도구는 ANSI 구문에 대한 SQL을 재 작성.

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

    4.그렇다 이유에서 가입 사업자가 당신의 SQL 코드를 확인하여, 다른 사람에 의해 언급 ANSI의 준수, 따라서 프런트 엔드 응용 프로그램을보다 쉽게 ​​다른 데이터베이스 플랫폼에 포팅 할 수 있도록한다.

    그렇다 이유에서 가입 사업자가 당신의 SQL 코드를 확인하여, 다른 사람에 의해 언급 ANSI의 준수, 따라서 프런트 엔드 응용 프로그램을보다 쉽게 ​​다른 데이터베이스 플랫폼에 포팅 할 수 있도록한다.

  5. ==============================

    5.조인 조건과 위치 조건이 최적화를 추가 힌트를 제공 할 수 있습니다에 검색어를 분리. 조건은 각 테이블에 매우 낮은 선택도 및 이론 외적의 튜플에 높은 선택성을 가지고 참여. 문은 일반적으로 더 높은 선택성을 가지고있는 조건.

    조인 조건과 위치 조건이 최적화를 추가 힌트를 제공 할 수 있습니다에 검색어를 분리. 조건은 각 테이블에 매우 낮은 선택도 및 이론 외적의 튜플에 높은 선택성을 가지고 참여. 문은 일반적으로 더 높은 선택성을 가지고있는 조건.

    A는 각 행에 대해 조인 조건에서 오른쪽 (반대의 경우도 마찬가지)의 값이 매우 가능성이 떠났다. 따라서 이러한 조건은 두 테이블에서 결과에 가입하는 것이 좋다,하지만 그들은 결과 세트에서 각 개별 테이블에서 값을 제거에 매우 도움이되지 미상.

    WHERE 절에 조건은 일반적으로 결과 집합에서 하나 개의 테이블에서 개별 행을 제거하는 데 사용할 수 있습니다.

    그래서 처음 실행하는 경우 각각의 테이블에 대한 조건과 결과 집합에서 가능한 한 행으로 제거 할 수있는 좋은 전략입니다. 그 중 하나가 사용할 수있는 후 살아남은 행을 결합하는 조건을 가입 할 수 있습니다.

    오라클 최적화 정말 쿼리를 최적화하기위한 힌트로 SQL 문에서 조건의 위치를 ​​사용하는 경우 그것은 분명하지 않다. 나는 그것이 테이블 통계의 하드 사실에 더 많은 관심을 것 같다 (오라클이 다른이 11g R1에 조인 처리하는 방법에 약간의 변화는, 자세한 내용은 오라클 최적화 팀이 게시물을 볼 수 있었다).

    인간으로 나를 위해 적어도 내가 이해하고 쿼리를 최적화하려고 할 때 문이 그을음 테이블에 선택성을 가지고 있는지 알고 많은 도움이 될 것입니다. 당신의 조건 중 하나를 넣어 대 (예를 들어, ON (a.x = b.x 및 a.y = b.y)를 ON 절에서 여러 조건을 넣어하려는 경우에도이 생각해야하는 위치 clasue : 그냥 체크, 조건이 선택 방법에 대해 설명합니다.

    기존 쿼리의있는 그대로의 구문을 유지한다. 새 쿼리를 만들거나 기존의 것을 리팩토링 할 때, "ON 가입"구문을 사용하여 선택에 요 정렬 조건을보십시오 : 하나의 테이블이 ON 부분에 넣어에 아주 선택할 수없는 경우, 그렇지 않으면 WHERE 부분에.

  6. ==============================

    6.연습으로, 당신은 항상 ANSI 구문을 사용합니다. 더 나은 패키지 및 절차에 재 작업하지 않습니다. 개별적으로 그 스크립트에 유지 보수를 수행 할 때 오히려 당신이 일을 해결할 수 있습니다. 때문에 구문 계획에 어떤 차이가 없을 것입니다.

    연습으로, 당신은 항상 ANSI 구문을 사용합니다. 더 나은 패키지 및 절차에 재 작업하지 않습니다. 개별적으로 그 스크립트에 유지 보수를 수행 할 때 오히려 당신이 일을 해결할 수 있습니다. 때문에 구문 계획에 어떤 차이가 없을 것입니다.

    모든 가능한 조합 퀘스트 SQL 최적화 재 작성은 더 나은 계획을 찾을 수 있습니다. 그래서 당신은 여전히 ​​100 개 이상의 결과에서 하나 개의 SQL을 검색해야합니다.

  7. ==============================

    7.외부 조인에 대한 외부 조인에 사용되는 (+) 기호는 오라클 구문입니다

    외부 조인에 대한 외부 조인에 사용되는 (+) 기호는 오라클 구문입니다

    신뢰할 수있는 오라클 소스에서 수집 된 정보에서 나는 200 개 + 패키지와 내부 오라클은 여전히 ​​오라클 구문 ANSI 구문에서 그들을 변환하기 때문에이 있기 때문에 당신이 오라클의 외부는 기존 패키지 구문 (+)에 가입 유지할 수 있음을 볼 수 있었다.

    (+) 연산자를 사용하는 제한이 미래의 ANSI 구문 친절 만들기 사용

    당신이 당신의 마이그레이션을 결정하는 데 도움이 (+) 기호 외부 조인에 대한 자세한 설명은 링크를 찾아주세요

    오라클 외부 구문 및 ANSI 구문 가입

    사용의 제한 (+) 외부 조인

    오라클 외부에 대한 자세한 내용 가입

    오라클 JDBC 드라이버를 사용할 때 (+) 외부는 운영자가 자바에 추천 가입

  8. ==============================

    8.나는 모두가 다른 프로젝트에 접근하고 I JOIN 구문을 선호 사용했다.

    나는 모두가 다른 프로젝트에 접근하고 I JOIN 구문을 선호 사용했다.

  9. ==============================

    9.일부 commenteers은 완전 외부 조인 (+) 구문을 허용하지 않습니다 말했다. (왼쪽 외부 조인) UNION ALL (오른쪽 외부 조인) : 이것은 문제가되지 않습니다, 그래서 그것은 않습니다.

    일부 commenteers은 완전 외부 조인 (+) 구문을 허용하지 않습니다 말했다. (왼쪽 외부 조인) UNION ALL (오른쪽 외부 조인) : 이것은 문제가되지 않습니다, 그래서 그것은 않습니다.

    다른 사람은 성능이 스위치를 만들 수있는 이유라고 말했다. 이는 특히 SQL에서, BS의 무리입니다. 물론, 당신은 일반적인 상황에없는 특정에 대한 조정이, 거기에 몇 가지 지침 있지만 모든 쿼리 및 모든 데이터베이스는 자신의 특색을 가지고있다.

    새 명시 적 문법에 반대 (+)로 전환하는 이유는, 옆에 표준없는, 한계가 있습니다 http://docs.oracle.com/cd/E16655_01/server.121/e17209/queries006.htm#SQLRF52354 . 시작은 여기에서 읽기 : "오라클은 당신이 절 OUTER에서를 사용하는 오라클보다는 JOIN 구문을 운영자에 가입하는 것이 좋습니다."

  10. ==============================

    10.(가) (+)보다는 가입하여, 업무에 경험되는 이야기 더 간단하고, 빠르고, 더 나은 (거기에 테이블의 많은, 당신은 (동의어를 통해) 다중 데이터베이스를 선택 작업을 특별히 때, 솔루션 사업에 더 나은보고 예 : 큰 데이터베이스에 40 개 + 테이블) (1000 표, 20 억 개 이상의 행이 일부 테이블), 당신은 큰 차이를 느낄 것이다.

    (가) (+)보다는 가입하여, 업무에 경험되는 이야기 더 간단하고, 빠르고, 더 나은 (거기에 테이블의 많은, 당신은 (동의어를 통해) 다중 데이터베이스를 선택 작업을 특별히 때, 솔루션 사업에 더 나은보고 예 : 큰 데이터베이스에 40 개 + 테이블) (1000 표, 20 억 개 이상의 행이 일부 테이블), 당신은 큰 차이를 느낄 것이다.

  11. ==============================

    11.나는 ANSI의 옹호는 지난 주까지 합류했다. 내 선택 중 하나에서 실현 이상한 행동까지. ANSI는 (+) 표기법으로 변환 한 후 처리중인 조인 - 오라클 버그 기지를 파고 후 나는 오라클은 ANSI는 기본적으로 조인 지원되지 배웠다. 그리고이 번역은 일부 수용 할 수없는 버그가 있습니다. 수없는 모두 새로운 버그도 12C 버전에서 도입 되었기 때문에 우리의 클라이언트 패치를 적용하고 있지 않기 때문에 - 세 개의 테이블, 하나 개의 레코드와 두 개의 외부 조인 매우 간단한 테스트 케이스. 사람처럼 보인다는 전혀 자동화 된 회귀 테스트를 수행하지 않는

    나는 ANSI의 옹호는 지난 주까지 합류했다. 내 선택 중 하나에서 실현 이상한 행동까지. ANSI는 (+) 표기법으로 변환 한 후 처리중인 조인 - 오라클 버그 기지를 파고 후 나는 오라클은 ANSI는 기본적으로 조인 지원되지 배웠다. 그리고이 번역은 일부 수용 할 수없는 버그가 있습니다. 수없는 모두 새로운 버그도 12C 버전에서 도입 되었기 때문에 우리의 클라이언트 패치를 적용하고 있지 않기 때문에 - 세 개의 테이블, 하나 개의 레코드와 두 개의 외부 조인 매우 간단한 테스트 케이스. 사람처럼 보인다는 전혀 자동화 된 회귀 테스트를 수행하지 않는

  12. from https://stackoverflow.com/questions/18891148/oracle-joins-comparison-between-conventional-syntax-vs-ansi-syntax by cc-by-sa and MIT license