2015-02-04 2 views
1

Where 절의 조건과 존재하는 것과 존재하지 않는 조건의 차이에 대해서는 의심의 여지가 있습니다. 나는 첫 번째 또는 두 번째 방법을 사용할 때 동일한 결과를 얻지 못할 것임을 알고 있지만, 누군가 이유를 설명하는 데 신경을 쓰나요? 예를 들어 존재 조건과 차이 조건

,

SELECT ACCOUNT_NO, 
     CLIENT_NAME 
FROM ACCOUNT a 
     LEFT JOIN CLIENT b 
       ON a.ACCOUNT_NO = b.ACCOUNT_NO 
WHERE ACCOUNT_TYPE NOT IN ('A', 'B', 'C') 

AND

SELECT ACCOUNT_NO, 
     CLIENT_NAME 
FROM ACCOUNT a 
     LEFT JOIN CLIENT b 
       ON a.ACCOUNT_NO = b.ACCOUNT_NO 
WHERE NOT EXISTS (SELECT * 
        FROM ACCOUNT_DET t1 
          LEFT JOIN ACCOUNT t2 
           ON t1.ACCOUNT_NO = t2.ACCOUNT_NO 
        WHERE ACCOUNT_TYPE NOT IN ('A', 'B', 'C')) 

?

나를 이해하시기 바랍니다. 테이블 ACCOUNT_DET은 (는) ACCOUNT와 거의 동일한 필드를 가지고 있지만이 필드는 제가 사용했던 것보다 더 단순화 된 쿼리입니다.

+1

하위 쿼리는 상관 관계가 없습니다. 즉, 하위 쿼리에 행이있는 경우 외부 쿼리는 행을 반환하지 않습니다. 이 방법을 사용하는 경우 부속 조회를 외부 조회와 상관시켜야합니다. –

+0

존재 vs IN http : // stackoverflow.com/questions/24929/difference-between-in-in-in-sql – SoulTrain

+0

내가 무슨 말을하는지, 내 쿼리를 EXISTS가 아닌 NOT EXISTS라는 하위 쿼리로 변경한다고 가정 해 봅시다. 나는 얻다? 이 두 절의 차이점을 이해하고 싶다면 원하는 경우 쿼리를 무시할 수 있습니다. – user2517370

답변

2

완전히 다른 검색어입니다.

두 경우 모두 동일하게 CLIENT로 왼쪽 결합을 무시해 보겠습니다.

제 질의

같이 설명 될 수있다 : A, B 또는 C

이외 타입

복귀 모든 계정

번째 쿼리

내측하면 검색어 (ACCOUNT_DET와 ACCOUNT 사이)가 이 아니고 행이 아닌 경우 ACCOUNT에서 모든 레코드를 반환합니다. 내부 쿼리의 결과로 하나 이상의 행이 있으면 아무 것도 반환하지 않습니다.

따라서 본질적으로 EXISTS는 참 또는 거짓으로 평가됩니다. 그리고 다음과 같은 쿼리 중 하나에 해당합니다 :

-- no rows returned by the inner query 
Select ACCOUNT_NO, CLIENT_NAME 
From ACCOUNT a left join CLIENT b on a.ACCOUNT_NO=b.ACCOUNT_NO 
Where NOT <false condition> 

-- At least one row returned by the inner query 
Select ACCOUNT_NO, CLIENT_NAME 
From ACCOUNT a left join CLIENT b on a.ACCOUNT_NO=b.ACCOUNT_NO 
Where NOT <true condition> 

결과 집합을 필터링하는 내부 쿼리를 사용

나는 당신의 의도는 당신이 할 수 있도록 관련 주 및 내부 쿼리를하는 것입니다 생각 기본 쿼리의 각 레코드를 필터링합니다. 이를 위해 내부 쿼리 인 내부의 기본 쿼리에서 테이블 별칭을 사용할 수 있습니다.

간단한 예는 같을 수

select * from ACCOUNT A 
where EXISTS(select * from ACCOUNT_DET D WHERE D.ACCOUNT_TYPE = A.ACCOUNT_TYPE) 

공지 내부 쿼리 별칭을 사용하는 방법을 'A'메인 쿼리에 정의 된 각각의 외측 행 내 질의에 관련 될 수있다.

¿ 어느 것이 더 낫습니까?

그러나이 작업은 조인을 사용하여 수행 할 수도 있습니다. 조인이 가독성 및 성능상의 이유로 작업을 수행 할 수있는 내부 쿼리를 피하는 것이 좋습니다.

관련 문제