는 생각의 일부 나 댓글을 통해 공유 :
확실한 솔루션입니다 - 두 테이블 where
절에 출납원을 필터링 한 후 (이에 대한 작업 코드를 알 필요가 없습니다)에 가입 . 주의 사항은 cashier
의 대소 문자로 처리해야하며 테이블에 저장된 내용과 일치해야합니다. (.. 테이블이 자본 C와 Cashier
을 말한다면, 다음도 해결이 where
조건이 있습니다해야하지만 이것이 최선의 선택은)
select e.first_name, e.last_name
from employee e join job j on e.job_code = j.job_code
where j.job_name = 'cashier'
이 많은 작업처럼 보인다 : 우리는에만 관심이있는 경우 계산원, 왜 우리는 두 테이블을 완전히 결합합니까? job
테이블에 행이 많은 경우 낭비되는 작업이 많지 않을까요? 우리는 그 테이블에서 한 행만 필요합니다! 올바른입니다
. 필터링을 먼저 수행하고 마지막으로 조인을 수행하도록 쿼리를 작성하는 것이 좋습니다. 뭔가 같이 :
는
select e.first_name, e.last_name
from employee e join (select job_code from job where job_name = 'cashier') j
on e.job_code = j.job_code
다행히, 우리는 첫 번째 양식의 쿼리를 작성하는 경우에도, 비용 기반 최적화 (쿼리 파서/컴파일러의 기본 구성 요소는) 두 번째 양식으로 변환됩니다. "Explain Plans"에 익숙하다면 시도해 볼 수 있습니다 :이 두 가지 쿼리와 비슷한 두 가지 쿼리를 작성하면 Explain Plan이 동일하다는 것을 알 수 있습니다.
이것은 개발자의 부분 개입없이 수행하고, 우리에게 약간의 유연성 (그것이 자신에게 참조 때 나는 그것을 "게으름"을 고려)을 할 수있다. - 예상되는 하위 쿼리를
select e.first_name, e.last_name
from employee
where job_code = (select job_code from job where job_name = 'cashier')
이 쿼리는 where
절에 "스칼라 하위 쿼리를"사용 : 물론
는 두 번째 양식은 모든 조인 쿼리도없이 작성 될 수 있음을 시사한다 한 열에 정확히 한 행을 생성하십시오.
힌트 :'JOIN'. 그것은 두 테이블을 결합합니다. –
** 조인 **을 사용하면 작업 코드를 알 필요가 없습니다. 두 개의 테이블을'job_code' 컬럼에 조인합니다. 이제는 각 직원의 이름과 주소뿐만 아니라'Job' 테이블에서 작업에 대한 모든 정보를 포함하는 긴 행을 갖습니다. job_code '값은 두 테이블 중 하나에 있습니다. 그럼에도 불구하고 조인을 사용하면 작업 설명 ** (모든 열에서)이 "출납원"인 직원 만 필터링하도록 필터링 할 수 있습니다 ('where' 절). 그런 다음 '선택'에서 직원 이름 만 선택하거나 필요한 것을 선택할 수 있습니다. – mathguy
@mathguy Ahh 저는 이것이 어떻게 합류 하는지를 몰랐습니다. 조인은 각 테이블의 일치하는 값을 반환해야한다고 생각했습니다.고맙습니다. –