2016-11-11 1 views
1

TableA의어떻게 TableB의에서 특정 배제

clientId clientPassword 
1   1234 
2   1234 
3   1234 

TableB의와 TableA의 행을 선택하여 쿼리를 얻을 수 있습니다 만 된 ClientID와 TableA.clientPassword를 선택하는 쿼리가 될 것입니다 무엇

clientId  clientCode 
1    TRN 
2    ABC 
3    CDE 
3    TRN 

TableB.clientCode에 'TRN'이 없습니까?

복잡한 질문 중 일부이지만 내 질문에 대한 대답이 간단합니다.

답변

1

없음 완벽하게 작품을 존재하고이 쓸 수있는 논리적으로 정직 방법이지만 항상 가장 성능이 좋은 옵션이 아닙니다. a not in을 사용하면 DB 시스템에 의존하여 행 단위로 실행되지 않도록 쿼리를 평평하게 할 수 있습니다. 이 간단한 쿼리를 사용하면 DB 시스템에서 알아낼 수 있지만 평평한 방식으로 작성할 수 있습니다.

SELECT a.* 
    FROM TableA a LEFT JOIN TableB b ON a.clientId = b.clientid 
            AND b.clientcode = 'TRN' 
WHERE b.ClientId IS NULL 

이 왼쪽이 ID의 원정 clientcode가 'TRN'는 테이블 A에 테이블 B에 가입합니다 가입하지만, 테이블 A의 모든 항목을 보존 할 때 기록 테이블 B에 대한 널 (NULL)이 조금 설명하기 'TRN'과 함께 존재하지 않으므로 null check는 다른 쿼리에 존재하지 않는 것과 동일하지만 상관 관계 서브 쿼리의 행을 검사하지 않고 훨씬 빠릅니다.

+0

재미있는 변형! Evan에게 감사드립니다. – Dev

+0

*는 각 행에 대해 개별적으로 실행되어야합니다. * : 사실이 아닙니다. SQL 구현을 특정 * 방식으로 제한하여 규칙을 수행하는 규칙은 없습니다. 그리고 대부분의 DBMS는 가능한 경우 상관 관계가있는 서브 쿼리를 "평평하게"합니다. 상관 하위 쿼리가 외부 조인과 실질적으로 다른 성능을 보이는 두 개의 논리적으로 동등한 최소 쿼리를 DBMS에서 찾았지만 문서화되지 않은 경우 문제 보고서를 제출하는 것이 좋습니다. 버그는 아니지만 최적화 기회입니다. –

+0

@ JamesK.Lowden 나는 그것을 부드럽게하고 쿼리의 DBMS 최적화를 허용하기 위해 내 게시물을 편집했습니다. –