2010-12-16 8 views
1

이 쿼리는 내가 이해이 쿼리는

select fname, lname 
    from Owner 
    where not exists 
     (select fname, lname 
      from Trainer) 

어떤 의미가 무엇을 의미합니까? 맞습니까?

답변

3

Owner 테이블에는 있지만 Trainer 테이블에는없는 사람들의 이름을 찾으십시오.

+8

아마도 의도 였지만 질의 작성자는 하위 선택을 최상위 선택 항목과 연결하지 않았습니다. 이 쿼리는'Trainer'가 비어 있으면'Owner'의 모든 행을 반환하고 그렇지 않으면 행을 반환하지 않습니다. – 9000

+0

@ 9000 : 아주 잘 잡습니다. 나는 그것을 놓쳤다는 것을 믿을 수 없다. – AgentConundrum

+0

하지만 쿼리를 실행할 때 두 테이블이 다르더라도 결과가 표시되지 않습니다. – Stive

2

trainer 테이블에 존재하지 않는 owner 테이블에서 모든 사람의 목록을 가져 오는 것은 매우 안타깝습니다.

---------------- 
fname | lname 
---------------- 
clark | kent 
lois | lane 

업데이트

다음 Owner 테이블

---------------- 
fname | lname 
---------------- 
clark | kent 
lois | lane 
peter | parker 

를 포함하고 트레이너 테이블

---------------- 
fname | lname 
---------------- 
peter | parker 
hal  | jordan 

가 포함되어있는 경우

그래서, 당신은 결과 세트를 얻어야한다

실제로 트레이너 테이블에 레코드가 있으면 쿼리에서 아무 것도 반환하지 않습니다. 아마도 다음을 사용해야합니다 :

select fname, lname 
from Owners 
where not exists (
    select fname, lname 
    from trainers 
    where fname=Owners.fname 
      and lname=Owners.lname 
    ) 
+0

비효율적이기 때문에 절름발이입니다. 그것은 조인으로 그것을하는 것이 낫다. –

+0

하지만 쿼리를 실행할 때 두 테이블이 다르더라도 결과가 표시되지 않습니다 – Stive

+0

? MySQL에 대해서는 잘 모르겠지만 MSSQL과 오라클은이 점을 잘 처리하고 종종 조인보다 더 효율적으로 만듭니다. – Lucero

1

쿼리는 '선택'과 '위치'의 두 부분으로 구성됩니다. 먼저 어디 부분에서 봐 :

where not exists 
     (select fname, lname from Trainer) 

이 무언가가있는 경우가 트레이너 테이블에 아무것도없고,에 '거짓'경우 절은 '사실'로 평가됩니다. 이제 '선택'부분을 살펴보십시오.

select fname, lname from Owners 

'소유자'테이블에서 모든 행을 선택합니다.

함께 넣기 : 쿼리는 소유자 테이블에서 모든 행을 선택하고 (있는 경우에만) 트레이너 테이블에 아무 것도 없습니다. 존재하는 경우에는 아무 것도 표시되지 않습니다.