2017-10-13 1 views
2

각 도시의 최저 임금 직원의 성을 표시하려고합니다. 도시 열은 LOCATIONS라는 제목 아래 직원 정보 (급여, 성)가 EMPLOYEES에 속합니다. 이 두 테이블은 공통 테이블이 아니므로 세 번째 테이블에 의존해야합니다. DEPARTMENTS에는 DEPARTMENTS에 EMPLOYEES와 LOCATIONS와 공유하는 department_id가 포함되어 있으며 LOCATION_ID와 LOCATION_ID가 공유됩니다. 이것은 내가 지금까지 가지고있는 것이지만 나는 과거에 거의 두 테이블 만 가지고 일한 것처럼 이것에 문제가있다.3 개의 테이블을 사용하는 하위 쿼리 SQL

SELECT LAST_NAME 
FROM EMPLOYEES 
WHERE (DEPARTMENT_ID) IN 
(SELECT DEPARTMENT_ID 
FROM DEPARTMENTS 
WHERE LOCATION_ID IN 
(SELECT LOCATION_ID 
FROM LOCATIONS 
GROUP BY CITY 
HAVING MIN(SALARY))); 

답변

0

WHERE 절에서 테이블 조인의 개념을 구분해야합니다. 데이터 필터링에 WHERE을 사용하고 데이터를 함께 연결하려면 JOIN을 사용하십시오.

나는 이것이 당신이 원하는 것이라고 생각합니다. 그건 그렇고, 할 수 있으면 모든 대문자를 잃어 버려.

SELECT 
    LAST_NAME 
FROM 
    EMPLOYEES 
    INNER JOIN (
     SELECT 
      DEPARTMENTS.DEPARTMENT_ID, 
      CITY, 
      MIN(SALARY) AS LOWEST_SALARY 
     FROM 
      EMPLOYEES 
      INNER JOIN DEPARTMENTS ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID 
      INNER JOIN LOCATIONS ON DEPARTMENTS.LOCATION_ID = LOCATIONS.LOCATION_ID 
     GROUP BY 
      DEPARTMENTS.DEPARTMENT_ID, 
      LOCATIONS.CITY 
    ) AS MINIMUM_SALARIES 
    ON EMPLOYEES.DEPARTMENT_ID = MINIMUM_SALARIES.DEPARTMENT_ID 
     AND EMPLOYEES.SALARY = MINIMUM_SALARIES.LOWEST_SALARY 
+0

MINIMUM_SALARIES의 조인은 별칭이 사용되므로 "LOWEST_SALARY"에 있어야합니다. –

+0

모든 대문자는 Oracle에서 슬프게도 표준입니다. – Twelfth

+1

이것은 또한 'Department_ID'에 의해 그룹화되기 때문에 도시별로 배수가 가장 낮은 배수를 반환 할 수 있습니다. 즉, 동일한 도시에서 출퇴근 도시 최저 임금과 동일한 여러 직원을받을 수 있습니다. 하위 쿼리에서 'Department_ID'를 삭제하고 외부의 도시 테이블에 가입하십시오. –

2

이것은 SQL의 인트로 과정에서 할당 된 것으로 보입니다. 따라서 분석 함수, match_recognize 절 등을 사용할 수 없다고 가정합시다. 조인과 집계 만합시다.

아래 WHERE 절의 하위 쿼리에서 각 도시의 최소 급여를 계산합니다. 우리는이 세 가지 테이블 모두에 참여해야합니다. 그런 다음 전체 쿼리에서 3 개의 테이블을 다시 결합하고 IN 조건 (세미 조인)에 하위 쿼리를 사용합니다. 전체 쿼리는 다음과 같습니다.

select e.last_name 
from employees e join departments d 
        on e.department_id = d.department_id 
        join locations l 
        on d.location_id = l.location_id 
where (e.salary, l.city) in 
     (
     select min(salary), city 
     from  employees e join departments d 
           on e.department_id = d.department_id 
           join locations l 
           on d.location_id = l.location_id 
     group by city 
     ) 
; 
0

우선 테이블을 결합하면 도시와 직원이 한 행에 표시됩니다. 우리가 도시별로 그룹화하면 우리는 도시 당 최저 급여를받습니다.

with city_employees as 
(
    select l.city, e.* 
    from locations l 
    join departments d using (location_id) 
    join employees e using (department_id) 
) 
select last_name 
from city_employees 
where (city, salary) in 
(
    select city, min(salary) 
    from city_employees 
    group by l.city 
); 

이는 윈도우 함수 (여기 min over 또는 rank over)과, 그러나,이를 달성하기 쉽다.

select last_name 
from 
(
    select 
    e.last_name, 
    e.salary, 
    min(e.salary) over (partition by l.city) as min_salary 
    from locations l 
    join departments d using (location_id) 
    join employees e using (department_id) 
) 
where salary = min_salary; 
+0

죄송하지만, 나는 20 분 전에 mathguy 님이 제공 한 답변과 동일한 답변임을 확인합니다. 죄송합니다. –

+0

lol - 답변 아래에 약간의 'delete'링크가 있으며, 이러한 상황에 사용될 수 있습니다. – mathguy

+0

WITH 절을 사용하는 것을 보았습니다. 여기서는 동일한 조인이 두 번 사용되었으므로 완벽하게 이해합니다. 나는 똑같은 일을하고 있지만, SQL의 소개 과정에서 WITH 절을 소개하는 방법이 얼마나 빠를 지 모른다. – mathguy

관련 문제