2016-10-08 5 views
0

Я пытаюсь сделать подзапрос join, чтобы возвращать только имена сотрудников, которые зарабатывают меньше 46000, и я могу заставить его работать, также возвращая идентификатор сотрудника, но не без него.Как подзапросить правильные результаты

Вот как я это делаю.

Select e.eid, e.ename 
From employee_table e 
Inner Join (
Select salary, eid 
from salary 
Where salary > 46000 
) as s 
On e.eid = s.eid; 
+0

Я бы начал с '<', а не '>'. –

+0

Вы выберете e.eid, e.ename'. Если вы хотите только имя, тогда выберите «e.ename». –

ответ

0

Так зарплата не хранится в таблице сотрудников, но в отдельной таблице заработной платы. Таблица зарплаты содержит идентификатор сотрудника. Это делает это соотношением 1: n, то есть один сотрудник может иметь более одной зарплаты.

Я не знаю ваших таблиц, поэтому я не знаю причины этого. Возможно, у сотрудника может быть много рабочих мест, или есть часть зарплат, как базовый оклад и дополнительные зарплаты, или есть диапазон дат, который хранится с зарплатой, чтобы указать, когда он/был действителен. Я не знаю.

Предположим, мы можем просто добавить зарплату работника, чтобы получить общее количество. Затем мы выбираем имена сотрудников из таблицы сотрудников, где мы находим зарплату менее 46000 в таблице зарплат.

select ename 
from employee 
where eid in 
(
    select eid 
    from salary 
    group by eid 
    having sum(salary) < 46000 
); 
2

Это beacuse вы используете динамичную временную таблицу, и если вы не выберите Ид столбца вашей временная таблица Dinamica не содержит эти значения и на предложение в присоединиться терпит неудачу

Select e.eid, e.ename 
    From employee_table e 
    Inner Join (
     Select salary, eid 
     from salary 
     Where salary < 46000 
) as s 
    On e.eid = s.eid; 

вы можете использовать внутреннее соединение без динамичной временной таблицы

Select e.eid, e.ename 
    From employee_table e 
    INNER JOIN salary s On e.eid = s.eid 
    where s.salary < 46000 
Смежные вопросы