INNER JOIN ON vs WHERE 절


941

간단하게하기 위해 모든 관련 필드가이라고 가정합니다 NOT NULL.

넌 할 수있어:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

그렇지 않으면:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

이 두 가지가 같은 방식으로 작동 MySQL합니까?




18
올바르게 이해 한 경우 첫 번째 변형은 ANSI SQL-89 암시 적 구문이고 두 번째 변형은 ANSI SQL-92 명시 적 조인 구문입니다. 둘 다 동일한 SQL 구현을 따르는 동일한 결과를 낳고 잘 수행 된 SQL 구현에서 동일한 쿼리 계획을 생성합니다. 개인적으로 SQL-89 구문을 선호하지만 많은 사람들이 SQL-92 구문을 선호합니다.
Mikko Rantalainen

11
@ Hogan 나는 다른 구문의 공식 이름을 지적했다. 답 중 전체 이름을 명시 적으로 언급하지 않았으므로 주석으로 추가하기로 결정했습니다. 그러나 내 의견은 실제 질문에 대답하지 않았으므로 답변이 아닌 의견으로 추가했습니다. (높은 투표 응답은 "INNER JOIN is ANSI syntax"및 "implicit join ANSI syntax is older"와 같은 주장이 있습니다. 두 구문이 서로 다른 ANSI 구문이기 때문에 아무 것도 말하지 않습니다.)
Mikko Rantalainen

답변:


710

INNER JOIN 사용해야하는 ANSI 구문입니다.

일반적으로 많은 테이블을 조인 할 때 더 읽기 쉬운 것으로 간주됩니다.

OUTER JOIN필요할 때마다 쉽게 교체 할 수 있습니다 .

WHERE구문은 더 관계형 모델을 지향한다.

두 테이블 JOINed 의 결과는 결합 열이 일치하는 행만 선택하는 필터가 적용되는 테이블의 데카르트 곱입니다.

WHERE구문으로 쉽게 볼 수 있습니다.

예를 들어, MySQL (및 일반적으로 SQL)에서이 두 쿼리는 동의어입니다.

또한 MySQL에는 STRAIGHT_JOIN절이 있습니다.

이 절을 사용하여 JOIN순서를 제어 할 수 있습니다 . 외부 루프에서 스캔되는 테이블과 내부 루프에있는 테이블.

WHERE구문을 사용하여 MySQL에서는이를 제어 할 수 없습니다 .


10
고마워요, Quassnoi. 당신은 당신의 대답에 많은 세부 사항을 가지고 있습니다. "예, 해당 쿼리는 동일하지만 더 읽기 쉽고 수정하기 쉬운 내부 조인을 사용해야합니다"라고 말하는 것이 공정합니까?
allyourcode

8
@allyourcode : 대한 Oracle, SQL Server, MySQLPostgreSQL- 예. 다른 시스템의 경우에도 마찬가지이지만 확인하는 것이 좋습니다.
Quassnoi

13
FWIW, WHERE절 에서 조인 조건과 함께 쉼표를 사용하는 것도 ANSI 표준에 있습니다.
Bill Karwin

1
@Bill Karwin: JOIN키워드는 과거에 볼 수있을 때까지 독점 표준의 일부가 아니 었습니다. 그것은에 그것의 방법을 만든 Oracle전용 버전에서 9와로 PostgreSQL버전 7.2(모두 출시 2001). 이 키워드의 모양은 ANSI표준 채택 의 일부 이므로이 키워드는 ANSI쉼표를 동의어로 지원하지만 이 키워드는 일반적으로와 관련이 CROSS JOIN있습니다.
Quassnoi

9
그럼에도 불구하고 ANSI SQL-89에 지정된 조인은 WHERE절 에서 쉼표와 조건으로 수행됩니다 (조건없이 조인은 말한 것처럼 교차 조인과 같습니다). ANSI SQL-92는 JOIN키워드 및 관련 구문을 추가 했지만 쉼표 스타일 구문은 여전히 ​​이전 버전과의 호환성을 위해 지원됩니다.
Bill Karwin

182

다른 사람들은 INNER JOIN인간의 가독성 을 돕는 것으로 지적했으며 , 이것이 최우선 과제라고 동의합니다. 조인 구문이 더 읽기 쉬운 이유
를 설명하려고합니다 .

기본 SELECT쿼리는 다음과 같습니다.

SELECT stuff
FROM tables
WHERE conditions

SELECT조항은 우리가 무엇 을 되찾고 있는지 알려줍니다 . FROM절은 우리에게 어디 우리가에서 그것을 얻고, 그리고 WHERE절은 우리에게 이야기 하는 우리가 얻고있는 것.

JOIN 테이블에 대한 설명이며, 테이블이 개념 상 실제로는 단일 테이블로 결합되는 방식에 대한 설명입니다.

테이블을 제어하는 ​​쿼리 요소 (우리가 물건을 가져 오는 위치)는 의미 적으로 FROM절에 속합니다 (물론 JOIN요소가 있는 위치 ). 조인 요소를 WHERE절에 넣으면 whichwhere-from을 병합 하므로 JOIN구문이 선호됩니다.


7
내부 조인이 Carl을 선호하는 이유를 설명해 주셔서 감사합니다. 나는 당신의 ans가 다른 사람들에게 암시 적이라고 생각하지만, 명시 적으로 더 좋습니다 (예, 저는 Python 팬입니다).
allyourcode

2
ON과 WHERE의 의미는 마지막 외부 조인 이후의 JOIN의 경우 어떤 것을 사용 하든 상관 없습니다 . JOIN의 일부로 ON을 특성화하지만 직교 곱 이후의 필터링 이기도 합니다. ON과 WHERE는 모두 카티 전 곱을 필터링합니다. 그러나 마지막 외부 조인 전에 ON 또는 WHERE가있는 부속 선택을 사용해야합니다 . (조인 열 쌍 "의"되지 않은 두 개의 테이블이 어떤 조건을 조인 할 수 특별히 열 평등 조인을 해석하는 단지 방법입니다...)
philipxy

INNER JOIN의 동일한 효과에 WHERE를 사용하는 경우에도 쿼리의 FROM 부분에서 두 테이블을 언급하게됩니다. 따라서 기본적으로 여전히 FROM 절에서 데이터를 가져 오는 위치를 암시하는 것이므로 반드시 "어느 곳과 어디에서 왔는지"라고 말할 수는 없습니다.
cybergeek654

@ArsenKhachaturyan 키워드 나 식별자가 텍스트에 사용된다고해서 이것이 코드이고 코드 형식이 필요하다는 것을 의미하지는 않습니다. 그것은 어떤 식 으로든 갈 수있는 형식 선택이며 여기에서 편집하는 것이 합리적이라면 모든 게시물을 다른 형식으로 지속적으로 편집하는 것이 합리적입니다. 즉, 정당하지 않습니다. (플러스 인라인 단어 별 코드 형식은 읽기가 어려울 수 있습니다.) 단락 구분에 대해서도 동일합니다. 특히 명확하지는 않습니다. 'which'대 'that'과 동일합니다. 그리고 프로그래밍 언어의 이름은 코드 형식 이 아니 어야 합니다. PS 오류가있는 줄 바꿈을 추가했습니다.
philipxy

@philipxy 당신이 언급 한 것처럼 "그것은 의미하지 않는다 ...", 그러나 그것은 분명히 그것이 키워드 키워드로 표시 될 수 없다는 것을 의미하지는 않았다. 그렇습니다. 선택은 가능하지만 그 사실을 알지 못하고 많은 게시물이 작성됩니다. 따라서 변경하기로 한 나의 결정은 아무것도 깨뜨리지 않고 더 읽기 쉽게 만듭니다. 변경 형식을 지정한 후 중단이 발견되면 유감스럽게도 해당 변경 사항을 되돌릴 수 있습니다.
Arsen Khachaturyan

143

ON / WHERE에서 조건문 적용

여기에서는 논리적 쿼리 처리 단계에 대해 설명했습니다.


참조 : Microsoft® SQL Server ™ 2005 T-SQL 쿼리
게시자 : Microsoft Press
Pub 날짜 : 2006 년 3 월 7 일
ISBN-10
인쇄 : 0-7356-2313-9 ISBN-13 인쇄 : 978-0-7356-2313-2
페이지 : 640

Microsoft® SQL Server ™ 2005 T-SQL 쿼리 내부

(8)  SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1)  FROM <left_table>
(3)       <join_type> JOIN <right_table>
(2)       ON <join_condition>
(4)  WHERE <where_condition>
(5)  GROUP BY <group_by_list>
(6)  WITH {CUBE | ROLLUP}
(7)  HAVING <having_condition>
(10) ORDER BY <order_by_list>

다른 프로그래밍 언어와 다른 SQL의 첫 번째 눈에 띄는 부분은 코드가 처리되는 순서입니다. 대부분의 프로그래밍 언어에서 코드는 작성된 순서대로 처리됩니다. SQL에서 처리되는 첫 번째 절은 FROM 절이며 가장 먼저 나타나는 SELECT 절은 거의 마지막에 처리됩니다.

각 단계는 다음 단계의 입력으로 사용되는 가상 테이블을 생성합니다. 이 가상 테이블은 호출자 (클라이언트 응용 프로그램 또는 외부 쿼리)에서 사용할 수 없습니다. 마지막 단계에서 생성 된 테이블 만 호출자에게 리턴됩니다. 쿼리에 특정 절을 지정하지 않으면 해당 단계를 건너 뜁니다.

논리적 쿼리 처리 단계에 대한 간략한 설명

단계에 대한 설명이 현재 이해가되지 않는 경우 너무 걱정하지 마십시오. 이들은 참조로 제공됩니다. 시나리오 예제 다음에 나오는 섹션에서는 단계를 훨씬 자세히 설명합니다.

  1. FROM : FROM 절의 처음 두 테이블간에 카티 전 곱 (크로스 조인)이 수행되어 가상 테이블 VT1이 생성됩니다.

  2. ON : ON 필터가 VT1에 적용됩니다. <join_condition>TRUE 인 행만 VT2에 삽입됩니다.

  3. OUTER (join) : OUTER JOIN이 지정되면 (CROSS JOIN 또는 INNER JOIN과 대조적으로) 일치하지 않은 보존 된 테이블 또는 테이블의 행이 VT2의 행에 외부 행으로 추가되어 생성됩니다. VT3. FROM 절에 두 개 이상의 테이블이 나타나면 모든 테이블이 처리 될 때까지 FROM 절의 마지막 조인 결과와 다음 테이블 사이에 1 단계부터 3 단계까지 반복적으로 적용됩니다.

  4. WHERE : WHERE 필터는 VT3에 적용됩니다. <where_condition>TRUE 인 행만 VT4에 삽입됩니다.

  5. GROUP BY : VT4의 행은 GROUP BY 절에 지정된 열 목록을 기준으로 그룹으로 정렬됩니다. VT5가 생성됩니다.

  6. 큐브 | 롤업 : 수퍼 그룹 (그룹 그룹)이 VT5의 행에 추가되어 VT6을 생성합니다.

  7. HAVING : HAVING 필터가 VT6에 적용됩니다. <having_condition>TRUE 인 그룹 만 VT7에 삽입됩니다.

  8. SELECT : SELECT 목록이 처리되어 VT8이 생성됩니다.

  9. DISTINCT : VT8에서 중복 행이 제거되었습니다. VT9가 생성됩니다.

  10. ORDER BY : VT9의 행은 ORDER BY 절에 지정된 열 목록에 따라 정렬됩니다. 커서가 생성됩니다 (VC10).

  11. TOP : 지정된 행 수 또는 백분율이 VC10의 시작부터 선택됩니다. 테이블 VT11이 생성되어 호출자에게 리턴됩니다.



따라서 (INNER JOIN) ON은 WHERE 절을 적용하기 전에 데이터를 필터링합니다 (VT의 데이터 수는 여기에서 줄어 듭니다). 후속 조인 조건은 필터링 된 데이터로 실행되어 성능이 향상됩니다. 그런 다음 WHERE 조건 만 필터 조건을 적용합니다.

(ON / WHERE에 조건문을 적용해도 몇 가지 경우에 큰 차이는 없습니다. 이는 조인 한 테이블 수와 각 조인 테이블에서 사용 가능한 행 수에 따라 다릅니다)


10
"따라서 (INNER JOIN) ON은 WHERE 절을 적용하기 전에 데이터를 필터링합니다 (VT의 데이터 수는 여기에서 줄어 듭니다)." 반드시 그런 것은 아닙니다. 이 기사는 논리적 처리 순서에 관한 것 입니다. 특정 구현이 다른 일보다 먼저 수행한다고 말할 때 구현 순서에 대해 이야기하고 있습니다. 구현이 논리적 순서를 따르는 것처럼 결과가 동일하다면 구현은 원하는대로 최적화 할 수 있습니다. Joe Celko는 유즈넷에서 이에 대해 많은 글을 썼습니다.
마이크 셰릴 '고양이 리콜'

@rafidheen "(INNER JOIN) ON은 성능을 향상시키는 WHERE 절을 적용하기 전에 데이터를 필터링합니다 ..." 좋은 지적. "그 후에 WHERE 조건 만 필터 조건을 적용합니다"HAVING 절은 어떻습니까?
James

@James rafidheen의 주장은 잘못되었습니다. 매뉴얼의 '조인 최적화'를 참조하십시오. 이 페이지에 대한 다른 의견들도 있습니다. (그리고 MikeSherrill'CatRecall 's) 이러한 "논리적"설명은 실제 계산 방식이 아니라 결과 값을 설명합니다. 이러한 구현 동작은 변경되지 않을 수도 있습니다.
philipxy

67

암시 적 조인 ANSI 구문은 오래되었으며 덜 명확하고 권장되지 않습니다.

또한 관계형 대수는 WHERE절과의 술어를 교환 할 수 INNER JOIN있으므로 절이있는 INNER JOIN쿼리 조차도 WHERE최적화 프로그램에 의해 술어가 재 배열 될 수 있습니다.

가능한 가장 읽기 쉬운 방법으로 쿼리를 작성하는 것이 좋습니다.

때로는 여기에는 INNER JOIN상대적으로 "불완전한"작성 및 WHERE필터링 기준 목록을보다 쉽게 ​​유지 보수 할 수 있도록하기 위해 일부 기준을 포함시키는 것이 포함됩니다.

예를 들어,

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
    AND c.State = 'NY'
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
    AND a.Status = 1

쓰다:

SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
    ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
    ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
    AND a.Status = 1

그러나 그것은 물론 다릅니다.


16
첫 발췌 문장이 내 뇌를 더 아프게한다. 누구든지 실제로 그렇게합니까? 내가 그런 사람을 만난다면 그를 머리 위로 때리는 것이 괜찮습니까?
allyourcode

3
가장 적합한 기준을 찾습니다. 일시적으로 일관된 스냅 샷 조회 테이블에 참여하는 경우 (그리고 유효한 날짜를 선택하는 뷰 또는 UDF가없는 경우) 유효하지 않은 날짜를 WHERE가 아닌 결합에 포함시킵니다. 실수로 제거 될 수 있습니다.
케이드 룰

14
@allyourcode : INNER JOIN에서 이러한 유형의 조인 구문을 보는 경우는 드물지만 RIGHT JOIN 및 LEFT JOINS에서 일반적으로 사용됩니다 .Join 술어에 세부 사항을 더 자세히 지정하면 서브 쿼리가 필요하지 않으며 외부 조인이 실수로 설정되지 않습니다. 내부 가입. (내부 조인의 경우 거의 항상 WHERE 절에 c.State = 'NY'를 넣는 것에 동의합니다)
Dave Markle

1
@allyourcode 나는 확실히 그렇게한다! 그리고 나는 Cade에 동의합니다. 나는 적절한 이유
Arth

31

암시 적 조인 (첫 번째 쿼리라고도 함)은 쿼리에 테이블을 더 추가하기 시작하면 훨씬 더 혼란스럽고 읽기 어려우며 유지 관리하기가 어렵습니다. 4-5 개의 서로 다른 테이블에서 동일한 쿼리 및 조인 유형을 수행한다고 상상해보십시오. 그것은 악몽입니다.

명시 적 조인 (두 번째 예)을 사용하면 훨씬 읽기 쉽고 유지 관리가 쉽습니다.


48
더 이상 동의하지 않았습니다. JOIN 구문은 매우 장황하고 구성하기가 어렵습니다. WHERE 절 조인을 사용하여 5, 10, 심지어 15 개의 테이블을 조인하는 많은 쿼리가 있으며 완벽하게 읽을 수 있습니다. JOIN 구문을 사용하여 이러한 쿼리를 다시 쓰면 혼란이 발생합니다. 이 질문에 대한 정답이 없으며 그것이 당신이 편한 것에 더 의존한다는 것을 보여줍니다.
노아 Yetter

33
노아, 난 당신이 소수에 있다고 생각합니다.
matt b

2
나는 매트와 노아에게 +1을 얻는다. 나는 다양성을 좋아한다 :). 노아가 어디에서 왔는지 알 수 있습니다. 내부 조인은 언어에 새로운 것을 추가하지 않으며 확실히 더 장황합니다. 반면, 'where'조건을 훨씬 짧게 만들 수 있으므로 일반적으로 읽기가 더 쉽습니다.
allyourcode

5
제정신 DBMS가 두 쿼리를 동일한 실행 계획으로 변환한다고 가정합니다. 그러나 실제로는 각 DBMS가 다르고 확실하게 알 수있는 유일한 방법은 실제로 실행 계획을 검사하는 것입니다 (즉, 직접 테스트해야합니다).
matt b

@rafidheen이 다른 답변 (상세한 SQL 실행 순서가있는 답변)에서 JOIN이 한 번에 하나씩 필터링되어 3 개 이상의 테이블의 전체 직교 조인과 비교할 때 조인 연산의 크기가 줄어든다는 것이 사실입니까? WHERE 필터가 소급 적용됩니까? 그렇다면 JOIN이 성능 향상 (다른 응답에서 지적한대로 왼쪽 / 오른쪽 조인의 장점)을 제공한다고 제안합니다.
James

26

또한 이전 구문을 사용하면 오류가 발생할 수 있습니다. ON 절없이 내부 조인을 사용하면 구문 오류가 발생합니다. 이전 구문을 사용하고 where 절에서 결합 조건 중 하나를 잊어 버리면 교차 결합을 얻게됩니다. 개발자는 종종 조인 자체가 손상되었다는 사실을 알지 못하기 때문에 조인을 수정하지 않고 구별 키워드를 추가하여 문제를 해결하지만 쿼리 속도를 상당히 늦출 수 있습니다.

또한 이전 구문에서 크로스 조인이있는 경우 유지 관리를 위해 유지 관리자는 크로스 조인이 필요한 상황이 있는지 또는 수정해야하는 사고인지 여부를 어떻게 알 수 있습니까?

왼쪽 조인을 사용하는 경우 암시 적 구문이 왜 나쁜지 알아 보려면이 질문에 대해 설명하겠습니다. Sybase * = 동일한 내부 테이블에 대해 2 개의 서로 다른 외부 테이블이있는 Ansi Standard

또한 명시 적 조인을 사용하는 표준은 20 년이 넘었으므로 20 년 동안 암시 적 조인 구문이 오래되었습니다. 20 년이 지난 구식 구문을 사용하여 응용 프로그램 코드를 작성 하시겠습니까? 왜 데이터베이스 코드를 작성 하시겠습니까?


3
@ HLGEM : 명시 적 JOIN이 더 낫다는 것에 동의하지만 이전 구문을 사용해야하는 경우가 있습니다. 실제 예 : ANSI JOIN은 2001 년에 릴리스 된 버전 9i에서만 Oracle에 도입되었으며 1 년 전 (표준이 게시 된 시점부터 16 년)까지만해도 8i 설치를 지원해야했습니다. 중요한 업데이트를 릴리스합니다. 두 세트의 업데이트를 유지하고 싶지 않았으므로 8i를 포함한 모든 데이터베이스에 대해 업데이트를 개발하고 테스트했기 때문에 ANSI JOIN을 사용할 수 없었습니다.
Quassnoi 2016 년

INNER JOIN이없는 sintax가 더 오류가 발생하기 쉽다는 것을 지적 할 때 +1 재미있는 포인트. "... 명시 적 조인을 사용하는 표준은 17 세입니다."라고 말하면 마지막 문장이 혼란 스러워요. 그렇다면 INNER JOIN 키워드 사용을 제안합니까?
Marco Demaio

1
@Marco Demaio, 예. 항상 INNER JOIN 또는 JOIN (이 두 개는 동일) 또는 LEFT JOIN 또는 RIGHT JOIN 또는 CROSS JOIN을 사용하고 암시 적 쉼표 조인을 사용하지 마십시오.
HLGEM

2
"왜 [20 세]의 데이터베이스 코드를 작성 하시겠습니까?" -SQL이 파생 테이블 지원을 시작한 이후 '오래된'을 사용하여 SQL 작성하는 것을 알았습니다 HAVING. 또한 '구식 화되었다'고 NATURAL JOIN주장하더라도 사용하지 않는 것으로 나타났습니다 INNER JOIN. 예, 당신은 당신의 이유가 있습니다 (여기에서 다시 언급 할 필요가 없습니다!) : 내 요점은, 오래된 구문을 사용하는 사람들도 그 이유가 있으며 구문의 상대적 나이는 관련이 거의 없습니다.
onedaywhen

1
여전히 표준에 있습니다 (그렇지 않은 곳을 보여주세요). 따라서 구식이 아닙니다. 또한, 쇼, 나에게, 일반적으로 DBMS를 멀리 보관해야합니다 개발자 "오히려 고정보다 가입" 멀리 떨어져있다.
Jürgen A. Erhard

12

그것들은 사람이 읽을 수있는 의미가 다릅니다.

그러나 쿼리 옵티 마이저에 따라 머신과 동일한 의미를 가질 수 있습니다.

항상 읽을 수 있도록 코드를 작성해야합니다.

즉, 이것이 기본 제공 관계인 경우 명시 적 조인을 사용하십시오. 약하게 관련된 데이터와 일치하는 경우 where 절을 사용하십시오.


11

SQL : 2003 표준은 일부 우선 순위 규칙을 변경하여 JOIN 문이 "쉼표"조인보다 우선합니다. 실제로 설정 방법에 따라 쿼리 결과가 변경 될 수 있습니다. MySQL 5.0.12가 표준 준수로 전환했을 때 일부 사람들에게 문제가 발생합니다.

따라서 귀하의 예에서 쿼리는 동일하게 작동합니다. 그러나 세 번째 테이블을 추가 한 경우 : SELECT ... FROM table1, table2 JOIN table3 ON ... WHERE ...

MySQL 5.0.12 이전에는 table1과 table2가 먼저 결합 된 다음 table3이 결합되었습니다. 이제 (5.0.12 이상) table2와 table3이 먼저 결합 된 다음 table1이 결합됩니다. 항상 결과를 변경하는 것은 아니지만 결과를 알지 못할 수도 있습니다.

더 이상 "쉼표"구문을 사용하지 않고 두 번째 예를 선택합니다. 어쨌든 훨씬 더 읽기 쉽습니다. JOIN 조건은 별도의 쿼리 섹션으로 분리되지 않고 JOIN과 함께 있습니다.


표준 SQL은 변경되지 않았습니다. MySQL은 잘못되었고 지금은 옳습니다. MySQL 매뉴얼을 참조하십시오.
philipxy

4

나는 당신이 MySQL에 대해 이야기하고 있다는 것을 알고 있지만 어쨌든 Oracle 9에서 명시 적 조인과 암시 적 조인은 다른 실행 계획을 생성합니다. Oracle 10 이상에서 해결 된 AFAIK : 더 이상 차이가 없습니다.


1

ANSI 조인 구문은 확실히 더 이식성이 있습니다.

Microsoft SQL Server의 업그레이드를 진행 중이며 SQL Server의 외부 조인에 대한 = * 및 * = 구문은 2005 SQL Server 이상에서 (호환성 모드없이) 지원되지 않는다고 언급합니다.


2
SQL Server 2000에서도 = 및 = 는 잘못된 결과를 초래할 수 있으므로 절대 사용해서는 안됩니다.
HLGEM

2
*==*ANSI 결코 없었다 좋은 표기 적이 없었다. 하위 선택이없는 외부 조인 (동시에 추가되었으므로 CROSS & INNER 조인에서는 실제로 필요하지 않음)에 ON이 필요한 이유입니다.
philipxy

1

동적 저장 프로 시저를 자주 프로그래밍하는 경우 두 번째 예제 (where 사용)를 좋아하게됩니다. 다양한 입력 매개 변수와 많은 모프 엉망이 있다면 이것이 유일한 방법입니다. 그렇지 않으면 둘 다 동일한 쿼리 계획을 실행하므로 클래식 쿼리에는 분명한 차이가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.