복붙노트

[SQL] 가입과 WHERE 쿼리를 필터링의 차이?

SQL

가입과 WHERE 쿼리를 필터링의 차이?

사이의 논리적 차이가있는 경우 SQL에서 나는 ID를 기반으로 필터 결과에 노력하고 궁금

SELECT value 
FROM table1 
JOIN table2 ON table1.id = table2.id 
WHERE table1.id = 1

SELECT value 
FROM table1 
JOIN table2 ON table1.id = table2.id AND table1.id = 1

나에게, 당신이 항상 결과의 동일한 세트를 얻을 것이다 그러나 당신은 두 개의 서로 다른 결과 집합을 얻을 것 (또는 그들이 항상 동일한 두 개의 결과 집합을 반환하는 아래에 어떤 조건이 있다면 나는 궁금하지만 논리가 다른 경우로 보인다 )

해결법

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

    1.대답은 NO 차이이지만 :

    대답은 NO 차이이지만 :

    난 항상 다음을 수행하는 것을 선호합니다.

    이 쿼리가 더 읽기 있습니다.

    나는이 쿼리를 사용합니다 그래서 :

    SELECT value
    FROM table1
    INNER JOIN table2
            ON table1.id = table2.id
    WHERE table1.id = 1
    

    당신이 외부 'S 가입 사용하는 경우에는 상태가 ON 상태 및 그 필터를 유지에 큰 차이가있다.

    논리 질의 처리

    다음은 다른 절 논리적으로 처리되는 순서에 따라 할당 단계 번호와 함께, 쿼리의 일반적인 형태를 포함한다.

    (5) SELECT (5-2) DISTINCT (5-3) TOP(<top_specification>) (5-1) <select_list>
    (1) FROM (1-J) <left_table> <join_type> JOIN <right_table> ON <on_predicate>
    | (1-A) <left_table> <apply_type> APPLY <right_table_expression> AS <alias>
    | (1-P) <left_table> PIVOT(<pivot_specification>) AS <alias>
    | (1-U) <left_table> UNPIVOT(<unpivot_specification>) AS <alias>
    (2) WHERE <where_predicate>
    (3) GROUP BY <group_by_specification>
    (4) HAVING <having_predicate>
    (6) ORDER BY <order_by_list>;
    

    도 논리 질의 처리 흐름

    그것은 책 "T-SQL 쿼리 (개발자 참조)"에서라고합니다

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

    2.(- 우측에 대한 첫 번째 테이블 조인 왼쪽 조인) VR46가 지적 INNER가 조인하여 차이가 없지만 외부 결합하여 두 번째 테이블의 값을 평가하는 경우, 상당한 차이가있다. 다음 설치를 고려하십시오

    (- 우측에 대한 첫 번째 테이블 조인 왼쪽 조인) VR46가 지적 INNER가 조인하여 차이가 없지만 외부 결합하여 두 번째 테이블의 값을 평가하는 경우, 상당한 차이가있다. 다음 설치를 고려하십시오

    DECLARE @Table1 TABLE ([ID] int)
    DECLARE @Table2 TABLE ([Table1ID] int, [Value] varchar(50))
    
    INSERT INTO @Table1
    VALUES
    (1),
    (2),
    (3)
    
    INSERT INTO @Table2
    VALUES
    (1, 'test'),
    (1, 'hello'),
    (2, 'goodbye')
    

    우리는 왼쪽 외부 조인 및 WHERE 절에 조건을 넣어 사용하여 선택하는 경우 :

    SELECT * FROM @Table1 T1
    LEFT OUTER JOIN @Table2 T2
        ON T1.ID = T2.Table1ID
    WHERE T2.Table1ID = 1
    

    우리는 다음과 같은 결과를 얻을 :

    ID          Table1ID    Value
    ----------- ----------- --------------------------------------------------
    1           1           test
    1           1           hello
    

    where 절은 결과 집합을 제한하기 때문입니다 우리는 단지 우리가 절에에 조건을 이동하는 경우, 그러나 1의 ID가 표에서 레코드를 포함하고 있습니다 그래서 :

    SELECT * FROM @Table1 T1
    LEFT OUTER JOIN @Table2 T2
        ON T1.ID = T2.Table1ID
        AND T2.Table1ID = 1
    

    우리는 다음과 같은 결과를 얻을 :

    ID          Table1ID    Value
    ----------- ----------- --------------------------------------------------
    1           1           test
    1           1           hello
    2           NULL        NULL
    3           NULL        NULL
    

    오히려 우리는이 가입 필터링하는 - 우리는 더 이상 하나의 표 1의 ID로 결과 세트를 필터링하지 않기 때문입니다. 결과 세트 (따라서 널 (null) 값을)하지만 - 그래서, 2의 표 1의 ID는 두 번째 테이블에서 일치를 가지고있다하더라도, 그것은 가입 대상에서 제외합니다.

    그래서, 내부 그것은 중요하지 않습니다 조인,하지만 당신은 가독성과 일관성을 위해 where 절에 보관해야합니다. 외부 조인에 대한 그러나, 당신은 당신의 결과 집합에 영향을 미칠대로 조건을 어디다가 중요합니까 점에주의 할 필요가 있습니다.

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

    3.나는 "오른쪽"으로 표시 대답은 옳지 않다고 생각합니다. 왜? 나는 설명하려고 :

    나는 "오른쪽"으로 표시 대답은 옳지 않다고 생각합니다. 왜? 나는 설명하려고 :

    우리는 의견이

    그리고 이것은 잘못된 것입니다. 내부 조인에 당신이 경우, 모든 시간이없는 경우에, ON 절에 필터 PARAMS을 넣어. 당신은 왜 물어? (모든 테이블이 10,000 RECS 있습니다. f.e) 10 개 테이블의 총 복잡한 쿼리를 상상 절 (예를 들어, 함수 또는 계산에 사용) WHERE 복잡한에 가입하려고합니다. 당신은 ON 절에 조건을 필터링 넣어 경우, 절을 전혀 실행되지 않습니다하지 발생이 10 개 테이블 간의 조인. 이 경우에 당신은 WHERE 절에 10000 ^ (10) 계산을 수행하지 않습니다. 이 메이크업 감각, WHERE 절에서만 필터링 PARAMS을 참을 수 없어.

  4. from https://stackoverflow.com/questions/34454867/difference-between-filtering-queries-in-join-and-where by cc-by-sa and MIT license