2012-08-09 3 views
0

와드 관리자가 아닌 직원을 표시하고 싶습니다.다른 테이블의 행과 일치하지 않는 행을 표시하는 방법은 무엇입니까?

SELECT Name, Grade, WardManager, StaffNo 
FROM STAFF, WARD 
WHERE WARD.WardManager = STAFF.StaffNo; 

그러나 내가 관리자 와드되지 않은 직원을 표시하는 방법을 알아낼 수 없습니다 :

나는 병동 관리자를 표시이 쿼리가 있습니다. 나는 NOT, NOT LIKE, NOT IN 등의 조합을 시도해 봤으며 그들 중 누구도 작동하지 않는 것 같습니다.

+1

열의 유형은 무엇입니까? –

+0

숫자입니다. – henry

+0

데이터 유형이 동일하면이 기능을 사용할 수없는 이유가 없습니다. 어떤 오류가 발생하고 있습니까? – Kamal

답변

1

잘 모르겠다. 테이블 구조를 제대로 이해하지 못했으나 누군가 NOT IN이 행을 반환하지 않는다고 불평하면 IN 연산자에 사용되는 열의 NULL 값에 거의 항상 문제가있다. 이 요구 당신이 원하는에 합류하지만, 할 일

select s.* 
    from staff s 
    left outer join ward w 
    on s.staffno = w.wardmanager 
where w.wardmanager is null 

:

select * 
from staff 
where staffno not in (select wardmanager 
         from ward 
         where wardmanager IS NOT NULL) 
+0

정말 아름답습니다. – henry

+0

@henry : 자세한 설명은 여기를 참조하십시오. http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx (SQL Server 구문이지만 기본 논리는 동일합니다) –

0

대안을 제공하는의이 또한 left outer join 함께 할 수있는 대답 a_horse_with_no_name하기 :

일이 시도 이 아닌 값은과 일치합니다.

더 빨리/더 효율적으로 it depends on your specific circumstances을 테스트하면 두 가지를 모두 테스트해야합니다.

ward 테이블에 관련 데이터가 없으므로 (모든 열은 null입니다)이 테이블에서 열을 선택하는 지점이 없습니다. 그러나 join의 이점은 원한다면 할 수 있다는 것입니다. 예를 들어, where 조항을 삭제했다면 와드 관리자 인 직원과 그렇지 않은 직원을 반환 할 수 있습니다. 차이점은 관리자가 아닌 경우 ward의 열은 항상 null입니다.

또 다른 방법은 where exists입니다. ward에서 어떤 열도 반환하지 않으려면 not in처럼 적합합니다.

select s.* 
    from staff s 
where not exists (select 1 
         from ward w 
        where wardmanager = s.staffno) 

다시 한 번 속도와 효율성은 사용자 환경과 테이블에있는 행 수에 따라 결정됩니다.

관련 문제