2016-07-26 2 views
1

다음은 적어도 한 명 이상의 강사에게 급여를받는 모든 강사의 이름을 선택하는 sql 쿼리입니다 (최소 유급 강사 한 명을 남겨 둡니다). 이 쿼리는 Korth의 Silberchatz의 Database System Concepts의 쿼리입니다. 그러나 나는이 방법으로 그것을 수행하는 데 필요한 한 가지를 제외하고 쿼리가 어떻게 사용되는지 시각화 할 수 없다.아래의 SQL 쿼리에 대한 설명

내가 생각하는 표를 시각화 할 수 있습니다.

select distinct T.name 
from instructor as T,instructor as S 
where T.salary > S.salary; 
+0

크로스 조인입니다. 설명을 위해 첨부 된 링크를 참조하십시오. http://stackoverflow.com/questions/3538225/how-does-select-from-two-tables-separated-by-a-comma-work-select- from-t1-t2 –

답변

2

해당 쿼리를 작성하는 또 다른 방법이 ... 일반적으로 CROSS JOIN의에서

SELECT DISTINCT 
    T.name 
FROM 
    instructor AS T 
CROSS JOIN 
    instructor AS S 
WHERE 
    T.salary > S.salary 

나쁜 생각입니다이다. 그리고 여기서 그들은 정말로 나쁜 생각입니다. 100 명의 강사가있는 경우 4950 개의 다른 조합을 평가하여 99 명의 강사로 구성된 고유 한 목록을 얻습니다.
- Instructor001이 지급됩니다 99 명 강사가 덜
- Instructor002이 지급됩니다 98 명 강사를 덜
있다 - ...
- 합계 4950 개 조합

경우 - Instructor100 덜
을 지불 00 강사가 1000 명의 강사가 499500 개의 조합을 평가하여 999 명의 강사로 구성된 고유 한 목록을 얻습니다.

더 좋은 아이디어가 될 것 ...

SELECT 
    i.Name 
FROM 
    instructor i 
WHERE 
    i.salary > (SELECT MIN(salary) FROM instructor) 

또는 ...

SELECT 
    i.Name 
FROM 
    instructor i 
WHERE 
    i.Name <> (SELECT Name FROM instructor ORDER BY Salary ASC LIMIT 1) 

또는 ... 그래서

SELECT 
    i.* 
FROM 
    instructor i 

EXCEPT 

SELECT 
    i.* 
FROM 
    instructor i 
ORDER BY 
    Salary ASC 
LIMIT 1 

, 당신은, 그것은 옳지 않아있어 필요한 경우 (또는 좋은 아이디어) 이렇게하면됩니다.

+1

'MIN'이 아닌가요? – Blank

+1

@JPG - 음, 우리 아빠는 아일랜드 인인가요? 그게 내가 생각할 수있는 가장 좋은 변명이야. Ooops, 고마워. – MatBailie

0

이 쿼리를 조금 리팩토링합시다.

SELECT DISTINCT T.name 
FROM instructor as T 
JOIN instructor as S ON T.salary > S.salary; 

정확히 똑같은 기능을하지만 다른 구문으로 표현됩니다 (더 효율적입니다). 이렇게하면 더 쉽게 읽을 수 있습니다.

이제 T 테이블은 사용자가 쿼리하는 베이스 테이블입니다. 다음으로 S 별칭 아래에 동일한 테이블을 가입하면 다른 교사와 비교하여 (T.salary > S.salary) 일치시킬 수 있습니다. 즉, S 강사가없는 결과 행을 T에서 제외한다는 의미입니다. 끝에

당신은 더 이상 적은 S 강사를 지불있다 T 강사를 중복 얻을하지 않기 위해, SELECT 절에 DISTINCT 키워드를 사용합니다.

+0

아직도 정말 나쁜 생각입니다. 'JOIN'을 사용하더라도 여전히 Cartesian 제품을 가지고 있습니다. – MatBailie

+0

'급여'입력란에 색인이있는 경우 입력하지 않아도됩니다. 물론 동일한 결과를 얻는 다른 (더 좋은) 방법이 있지만 가장 중요한 것은 쿼리 논리를 설명하는 것입니다. 그것은 단지 운동입니다. –

+0

인덱스가있는 경우에도 이것은 데카르트 제품입니다. 100 명의 강사 목록을 가져와 강사가 99 명의 다른 사람들과 가장 많이 합류했습니다. 2 위는 98 명과 합류한다. 그리고 100 번째가 될 때까지 0 명과 합류합니다. 총 4950 가지 조합이 제공됩니다. 어떤 사람에게 * DISTINCT를 적용합니다. 499500 가지 조합을 제공하는 1000 명의 강사. 그리고 ... – MatBailie