복붙노트

[SQL] 때 또는 당신이 오른쪽 외부를 사용하는 이유에 참여하는 대신 왼쪽?

SQL

때 또는 당신이 오른쪽 외부를 사용하는 이유에 참여하는 대신 왼쪽?

위키 백과 고정자 :

"그들은 항상 왼쪽 외부로 대체 조인 및 추가 기능을 제공 할 수 없습니다 때문에 실제로 명시 오른쪽 외부는 거의 사용되지 조인."

사람이 그들이 RIGHT 표기법, 그리고 왜를 사용하는 것이 바람직 한 상황을 제공 할 수 있습니까? 나는 이제까지 그것을 사용하는 이유를 생각할 수 없다. 나를 위해, 그것은 지금까지 일을 더 명확하게하지 않을 것입니다.

편집하다: 나는 (+) 구문에서 자신을 버리게하는 새해의 해상도를 만드는 오라클의 베테랑입니다. 나는 바로 그것을하고 싶은

해결법

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

    1.내가 생각할 수있는 유일한 이유는 당신의 SQL 더 자기 문서화를 만들려고 노력 RIGHT OUTER가 가입되어 사용할 수 있습니다.

    내가 생각할 수있는 유일한 이유는 당신의 SQL 더 자기 문서화를 만들려고 노력 RIGHT OUTER가 가입되어 사용할 수 있습니다.

    당신은 아마도 왼쪽 사용할 일대 다 관계의 종속 (많은) 옆에 널 (null) 행이 쿼리에 조인 할 오른쪽 독립적 인 측면에서 널 (null) 행을 생성하는 쿼리에 조인 할 수 있습니다.

    가게의 코딩 요구 사항이 FROM 절에 테이블 선언의 순서를 지정하는 경우에도 생성 된 코드에서 발생할 수 있습니다.

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

    2.RIGHT B는 A가 B LEFT가 가입 같은 조인

    RIGHT B는 A가 B LEFT가 가입 같은 조인

    B ON RIGHT는 다음 A가 데이터 세트의 왼쪽에있는 A. 수단 조인 B RIGHT는 읽기 가입. 다만 LEFT 같은 B가 가입

    당신은 왼쪽에서 오른쪽으로 조인 다시 정렬 할 수 있습니다 경우 얻을 수없는 성능이 없습니다.

    내가 하나를 잘 사용하는 이유를 생각할 수있는 유일한 이유는 당신이 밖으로 내부의 측면에서 생각하는 것처럼 (오른쪽 헤더에 가입 세부 SELECT * FROM) 그 사람의 유형 경우입니다 가입. 그것은 작은 엔디안 같은 다른, 빅 엔디안과 같은 다른, 디자인 하향식 같은 다른, 아래에서 위로의 디자인처럼 다른 사람 같아요.

    당신은 당신이 쿼리를 재 배열 할 수있는 목에 통증이 때, 다른 테이블을 추가 할 위치를 이미하는 엄청난 쿼리가 그래서 바로 가입하여 기존 쿼리에 테이블을 연결하면 다른 하나입니다.

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

    3.나는 바로 사용하지 전에 가입하고 내가 실제로 필요한 수 있고, 그것이 약간 부 자연스러운 것 같다 생각해 본 적이 없어요. 나는 그것에 대해 생각 후 외부가 많은 테이블의 교차에 하나 개의 테이블 조인에이 같은 테이블을 가지고, 그래서 당신이 필요로 할 때, 그것은 상황에서 정말 유용 할 수있다 :

    나는 바로 사용하지 전에 가입하고 내가 실제로 필요한 수 있고, 그것이 약간 부 자연스러운 것 같다 생각해 본 적이 없어요. 나는 그것에 대해 생각 후 외부가 많은 테이블의 교차에 하나 개의 테이블 조인에이 같은 테이블을 가지고, 그래서 당신이 필요로 할 때, 그것은 상황에서 정말 유용 할 수있다 :

    그리고이 같은 결과를 얻으려면 :

    또는 SQL (MS SQL 서버)에서 :

    declare @temp_a table (id int)
    declare @temp_b table (id int)
    declare @temp_c table (id int)
    declare @temp_d table (id int)
    
    insert into @temp_a
    select 1 union all
    select 2 union all
    select 3 union all
    select 4
    
    insert into @temp_b
    select 2 union all
    select 3 union all
    select 5
    
    insert into @temp_c
    select 1 union all
    select 2 union all
    select 4
    
    insert into @temp_d
    select id from @temp_a
    union
    select id from @temp_b
    union
    select id from @temp_c
    
    select *
    from @temp_a as a
        inner join @temp_b as b on b.id = a.id
        inner join @temp_c as c on c.id = a.id
        right outer join @temp_d as d on d.id = a.id
    
    id          id          id          id
    ----------- ----------- ----------- -----------
    NULL        NULL        NULL        1
    2           2           2           2
    NULL        NULL        NULL        3
    NULL        NULL        NULL        4
    NULL        NULL        NULL        5
    

    왼쪽으로 전환 가입한다면, 결과는 동일하지 않습니다.

    select *
    from @temp_d as d
        left outer join @temp_a as a on a.id = d.id
        left outer join @temp_b as b on b.id = d.id
        left outer join @temp_c as c on c.id = d.id
    
    id          id          id          id
    ----------- ----------- ----------- -----------
    1           1           NULL        1
    2           2           2           2
    3           3           3           NULL
    4           4           NULL        4
    5           NULL        5           NULL
    

    유일한 방법은 바로 조인하지 않고이 작업을 수행하는 공통 테이블 표현식 또는 하위 쿼리를 사용하는 것입니다

    select *
    from @temp_d as d
        left outer join (
            select *
            from @temp_a as a
                inner join @temp_b as b on b.id = a.id
                inner join @temp_c as c on c.id = a.id
        ) as q on ...
    
  4. ==============================

    4.나는 오른쪽 외부의 생각 유일한 시간 나는 전체가 참여 고정되었고, 단지 내가 오른쪽에있는 테이블의 모든 레코드를 포함하는 결과 필요하다고 일어난 경우 조인. 심지어 게으른으로 나는대로하지만, 나는 아마 내가 왼쪽 조인을 사용하도록 재 배열 것이 짜증 얻을 것이다.

    나는 오른쪽 외부의 생각 유일한 시간 나는 전체가 참여 고정되었고, 단지 내가 오른쪽에있는 테이블의 모든 레코드를 포함하는 결과 필요하다고 일어난 경우 조인. 심지어 게으른으로 나는대로하지만, 나는 아마 내가 왼쪽 조인을 사용하도록 재 배열 것이 짜증 얻을 것이다.

    위키 백과 쇼에서이 예제는 말은 무엇을 :

    SELECT *  
    FROM   employee 
       FULL OUTER JOIN department 
          ON employee.DepartmentID = department.DepartmentID
    

    당신은 단지 ON 절의 순서를 교체하지 않고도 새 쿼리를 오른쪽으로 단어 전체를 교체합니다.

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

    5.

    SELECT * FROM table1 [BLANK] OUTER JOIN table2 ON table1.col = table2.col
    

    와 [BLANK]를 바꾸기 :

    LEFT - 일치의 표 2의 (도 포함이 일치과 표 2의 기록이다) 것을 그들이 COL이없는 경우에도 당신이 표에서 모든 레코드를 원하는 경우

    RIGHT - 당신은 표 2에서 모든 레코드를 원한다면 그들은 경기의 표 1의 (도 포함이 일치와 표 1의 기록이다)하는 COL이없는 경우에도

    FULL - 당신은 표 1에서와 표 2에서 모든 레코드를 원하는 경우

    모두의 이야기는 무슨 일입니까? 그들은 같은이야? 그렇게 생각하지 않아요.

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

    6.

    SELECT * FROM table_a
    INNER JOIN table_b ON ....
    RIGHT JOIN table_c ON ....
    

    어떻게 다른 당신은 빠르게 / 쉽게 내부는 table_c의 모든 행을 보장하면서 항상 선택되어 처음 2 개 테이블을 조인하고 table_c에 가입 할 수?

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

    7.SQL 문은 올바른 것뿐만 아니라, (그들은 하나의 원자 행동을 나타내며, 당신의 마음 요구가 의도하지 않은 결과를 방지하기 위해 완전히 그들을 grok 수 있기 때문에.) 가끔 표현이 더 명확로 언급 읽기 쉽고 표정 간결 가능한 한해야한다 오른쪽 외부 조인.

    SQL 문은 올바른 것뿐만 아니라, (그들은 하나의 원자 행동을 나타내며, 당신의 마음 요구가 의도하지 않은 결과를 방지하기 위해 완전히 그들을 grok 수 있기 때문에.) 가끔 표현이 더 명확로 언급 읽기 쉽고 표정 간결 가능한 한해야한다 오른쪽 외부 조인.

    그러나 사람은 항상 다른로 변환 할 수 있으며, 옵티마이 저는 다른 하나와도 할 것입니다.

    아주 잠시 동안 만 LEFT OUTER를 지원하는 주요 RDBMS 제품 중 적어도 하나는 가입하세요. (나는 그것이 MySQL을했다 생각합니다.)

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

    8.내가 권리를 사용했습니다 유일한 시간은 내가 두 종류의 데이터를보고 할 때왔다 가입하고 난 이미 왼쪽의 특정 순서로 조인 또는 내부 이전에 기록 된 쿼리에 가입해야합니다. 이 경우,이 기록은 표 A에 있지만 테이블 B와 기록하지 표 B뿐만 표 A의 또 다른 세트에 포함되지 않은 하나 개의 데이터 세트로보고 싶은 말한다. 그렇다하더라도 나는 시간 연구를하고 저장하기 위해이 작업을 수행 할 경우에만 경향이 있지만, 한 번 이상 실행 될 코드가 있다면 그것을 변경합니다.

    내가 권리를 사용했습니다 유일한 시간은 내가 두 종류의 데이터를보고 할 때왔다 가입하고 난 이미 왼쪽의 특정 순서로 조인 또는 내부 이전에 기록 된 쿼리에 가입해야합니다. 이 경우,이 기록은 표 A에 있지만 테이블 B와 기록하지 표 B뿐만 표 A의 또 다른 세트에 포함되지 않은 하나 개의 데이터 세트로보고 싶은 말한다. 그렇다하더라도 나는 시간 연구를하고 저장하기 위해이 작업을 수행 할 경우에만 경향이 있지만, 한 번 이상 실행 될 코드가 있다면 그것을 변경합니다.

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

    9.정말 잘 결합하지만 난 SQL 쿼리를 작성하는 거의 20 년 동안하지 않은 것으로 가정 하나를 사용하기위한 사운드 정당화 건너에 많은 생각이 없었습니다. 나는 확실히 내가 개발자가 내장 된 쿼리 빌더 사용했던 곳에서 발생하는 추측에는 요들을 많이 보았다.

    정말 잘 결합하지만 난 SQL 쿼리를 작성하는 거의 20 년 동안하지 않은 것으로 가정 하나를 사용하기위한 사운드 정당화 건너에 많은 생각이 없었습니다. 나는 확실히 내가 개발자가 내장 된 쿼리 빌더 사용했던 곳에서 발생하는 추측에는 요들을 많이 보았다.

    '난 당신이 몇 시간 동안 쿼리를 방문하지 않은 경우 그들은 단지 배우거나 재 - 배울 너무 많은 추가 정신적 에너지를 필요로 발견했습니다과 여태 - 내가 하나가 발생했습니다 때마다, 나는 그것을 제거하기 위해 쿼리를 다시 작성했습니다 t이 손실 될 또는 잘못된 결과를 반환하는 쿼리의 의도에 대한 드문 일이었다 - 그리고 그것은 일반적으로 쿼리가 작동하지 않는 이유 검토에 나에 대한 요청하게되었다이 부정확합니다.

    당신이 소개되면 그것에 대해 생각에서 마우스 오른쪽을 조인, 당신은 지금 내가 중간에 충족 할 필요 로직의 경쟁 가지를 고려했던 것과 있습니다. 추가 요구 사항 / 조건을 도입하는 경우,이 지점 모두 더 연장 될 수 있으며, 당신은 지금 당신이 한 가지 잘못된 결과를 초래 제공되지 않도록 저글링 데있어 복잡성이있다.

    당신이 권리를 소개하면 또한, 쿼리에 대한 작업을 나중에 할 수있다 단순히 쿼리의 오른쪽에 가입 부분과, 그렇게에서 추가 테이블에 볼트가 경쟁 논리를 확장하면 해당 여전히 충족해야 흐르고, 다른 덜 숙련 된 개발자 가입 중간; 또는 어떤 경우에는 내가 본 그들은 원래의 논리를 만지고 싶지 않기 때문에 중첩 뷰를 시작, 그들은 쿼리 나 논리를 몰고 장소에 있던 비즈니스 규칙을 이해하지 수 있기 때문에 아마도 부분이있다했습니다.

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

    10.일부 SQL 데이터베이스, 그들은 FROM 절에 나타나는 순서대로 테이블을 조인 최적화에게 최적화 힌트가있다 - 예를 들어, / * + 오라클에 * / 명령했다. 몇 가지 간단한 구현에서, 이것은 심지어 유일한 실행 계획을 사용할 수 있습니다.

    일부 SQL 데이터베이스, 그들은 FROM 절에 나타나는 순서대로 테이블을 조인 최적화에게 최적화 힌트가있다 - 예를 들어, / * + 오라클에 * / 명령했다. 몇 가지 간단한 구현에서, 이것은 심지어 유일한 실행 계획을 사용할 수 있습니다.

    이러한 경우는 FROM 절 문제에 테이블의 순서대로 그렇게 RIGHT 유용 할 수있다 가입하세요.

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

    11.나는 당신이 바로이 경우에 참여하지 않으면 어려운 것 같아요. 오라클과 함께 전.

    나는 당신이 바로이 경우에 참여하지 않으면 어려운 것 같아요. 오라클과 함께 전.

    with a as(
         select 1 id, 'a' name from dual union all
         select 2 id, 'b' name from dual union all
         select 3 id, 'c' name from dual union all
         select 4 id, 'd' name from dual union all
         select 5 id, 'e' name from dual union all
         select 6 id, 'f' name from dual 
    ), bx as(
       select 1 id, 'fa' f from dual union all
       select 3 id, 'fb' f from dual union all
       select 6 id, 'f' f from dual union all
       select 6 id, 'fc' f from dual 
    )
    select a.*, b.f, x.f
    from a left join bx b on a.id = b.id
    right join bx x on a.id = x.id
    order by a.id
    
  12. from https://stackoverflow.com/questions/436345/when-or-why-would-you-use-a-right-outer-join-instead-of-left by cc-by-sa and MIT license