2009-09-02 2 views
3

이 두 쿼리가 서로 다른가요?innerjoin을 사용하고 from 세그먼트에 직접 모든 테이블을 쓰는 것 사이에 어떤 차이가 있습니까?

쿼리 1 :

SELECT * FROM Table1, Table2 WHERE Table1.Id = Table2.RefId 

질의 2 :

SELECT * FROM Table1 INNER JOIN Table2 ON Table1.Id = Table2.RefId 

나는 두 가지 방법을 분석하고 그들은 분명 같은 실제 실행 계획을 생성했다. 내부 조인을 사용하는 것이 더 효율적인 방식으로 작동하는 경우를 알고 계십니까? "Query 1"의 방식에 접근하는 것이 아니라 내부 조인을 사용하는 것의 실제 이점은 무엇입니까?

+0

비슷한 질문 : 예를 들면 다음과 같습니다이야 외부 조인 http://stackoverflow.com/questions/670980/performance-of-inner-join-compared-to-cross-join – soulmerge

답변

3

제공하신 두 문장은 기능적으로 서로 같습니다.

변형은 다양한 SQL 구문 표준으로 인해 발생합니다.

정말 흥미 진진한 읽기를 원하면 다음 Wikipedia 링크를 방문하여 다양한 SQL 표준을 조회 할 수 있습니다. 오른쪽에는 SQL의 다양한 방언/표준에 대한 참조 및 링크가 있습니다. 내부 조인을 지정하는 것이 선호되는 방법입니다 및 ISO 형식을 다음 불구하고

http://en.wikipedia.org/wiki/SQL

+3

오래된 스타일이다 최신 버전에서는 사용되지 않으므로 모든 쿼리에 JOIN을 사용하는 것이 좋습니다. – gbn

1

이러한 결과는 동일한 쿼리 계획이되지만 INNER JOIN, OUTER JOIN 및 CROSS JOIN 키워드는 코드에 명확함을 더하기 때문에 선호됩니다.

FROM 절의 키워드를 사용하여 힌트를 구체적으로 지정할 수 있지만 WHERE 절에서보다 복잡한 조인을 수행 할 수 있습니다. 하지만 그렇지 않으면 쿼리 계획에 차이가 없습니다.

3

이 SQL 문은 동의어이다. where 절에서 테이블을 조인하는 배관을 제한하고 쿼리의 목표를 명확하게하기 때문에이 방법을 선호합니다.

+0

또한 왼쪽 조인에서 ON의 조건은 WHERE의 동일한 조건과 완전히 다릅니다. –

1

또한 첫 번째 구문은 쿼리가 복잡해지면서 부주의 한 교차 조인 (cross joins)에 훨씬 더 많이 부합한다고 덧붙일 것입니다. 또한이 구문의 왼쪽 및 오른쪽 조인은 SQL 서버에서 제대로 작동하지 않으므로 사용하지 않아야합니다. 왼쪽 조인을 추가 할 때 구문을 혼합하면 쿼리가 결과를 올바르게 반환하지 않는 문제가 발생할 수도 있습니다. 첫 번째 예제의 구문은 17 년 동안 구식 이었으므로 사용하지 않아도됩니다.

+0

나는 이것을 잡아서 고쳐 썼다. 당신이이 논평을 쓰는 동안 그렇게했을 것이다. – HLGEM

0

쿼리 1은 이전 구문 스타일로 간주되므로 사용하지 않는 것이 좋습니다. 해당 구문 스타일을 사용하여 LEFT 조인과 Right 조인을 사용할 때 문제가 발생합니다. 또한 SQL Server에서는 서로 다른 형식의보기를 사용하는 쿼리에서이 두 가지 서로 다른 syles를 함께 사용하여 문제를 해결할 수 있습니다.

0

LEFT OUTER JOIN S를 사용하고 WHERE 절 대신 ON 절에 조인 된 테이블의 조건을 넣으면 큰 차이가 있음을 발견했습니다. WHERE 절의 조인 된 테이블에 조건을 넣으면 왼쪽 외부 조인을 무시합니다.

오라클을 사용했을 때, 내가 아는 바에 따라 조인 된 테이블 (WHERE 절의 조인 조건을 포함한 모든 조건 포함)에 고풍 (+)을 사용했습니다. 우리가 SQL Server 상점이되었을 때, 나는 LEFT OUTER JOIN을 사용하도록 강요 받았고,이 동작을 발견 할 때까지 이전과 같이 작동하지 않는다는 것을 발견했습니다.내가 가졌던

select NC.*, 
     IsNull(F.STRING_VAL, 'NONE') as USER_ID, 
     CO.TOTAL_AMT_ORDERED 
from customer_order CO 
INNER JOIN VTG_CO_NET_CHANGE NC 
ON  NC.CUST_ORDER_ID=CO.ID 
LEFT OUTER JOIN USER_DEF_FIELDS F 
ON  F.DOCUMENT_ID = CO.ID and 
     F.PROGRAM_ID='VMORDENT' and 
     F.ID='UDF-0000072' and 
     F.DOCUMENT_ID is not null 
where NC.acct_year=2017 
관련 문제