Если мы разбиваем то, что вы пытаетесь сделать:
coalesce
дает первое значение, если оно не равно нулю, затем второе и т. Д. Вы не указали никаких условий соединения, поэтому выВы делаете cartesian join
между emp
и salgrade
.Это вернет количество строк в emp
, умноженное на количество строк в salgrade
;при условии вашего условия соединения.
Вторая часть вашего запроса делает то же самое в обратном направлении.
Предполагая, что table_structure:
create table emp (
emp_id number
, salary number -- current salary
, salgrade_id number -- current salary grade
, dept_id -- current department
);
create table salgrade (
, salgrade_id number
, hisal number -- max salary for that grade
);
Вы хотитеделать что-то вроде этого:
select least( e.salary * 1.15, s.hisal )
from emp e
join salgrade s
on e.salgrade_id = s.salgrade_id
Функция least
аналогична min
;в том, что он будет принимать минимальное значение.Однако он работает с несколькими столбцами в одной строке, а не с несколькими строками в одном столбце.
Принимая значения least
из hisal
и salary * 1.15
, мы гарантируем, что при увеличении зарплаты будет большечем hisal
, то вместо этого берется hisal
.
В этом случае join
означает, что для каждого emp_id
мы берем hisal
для соответствующего уровня заработной платы.Я бы настоятельно рекомендовал читать о соединениях SQL - эта ссылка была 7-й в Google, что было немного удивительно (Джефф, кажется, везде), но это довольно хорошо и имеет много других ссылок.
Чтобы изменить запрос, чтобы вы могли выполнять его для всех сотрудников, зарабатывающих более 100 000 (богатые становятся богаче), это выглядело бы примерно так:
select least( e.salary * 1.15, s.hisal )
from emp e
join salgrade s
on e.salgrade_id = s.salgrade_id
where e.salary > 100000
Или усложнять ситуацию, если вы хотитесделайте это только для ИТ-специалистов (почему бы и нет), вы можете расширить это на что-то вроде этого:
select least( e.salary * 1.15, s.hisal )
from emp e
join salgrade s
on e.salgrade_id = s.salgrade_id
join dept d
on e.dept_id = d.dept_id
where d.dept = 'IT'
Эти объединения, будучи inner joins
в отличие от outer joins
(обычно left outer joins
- см.ссылка) подразумевает, что каждый сотрудник имеет оценку и отдел.