【问题标题】:Select something from a nested select从嵌套选择中选择一些东西
【发布时间】:2017-01-31 10:53:58
【问题描述】:

my database 中,我有一个表salary 存储员工过去或当前的工资,还有一个表employees 存储我的员工。

我正在尝试选择所有获得晋升的员工:

select first_name, last_name 
from salaries 
join employees on employees.emp_no = salaries.emp_no 
where salaries.from_date > employees.hire_date 
  and salary > 
  (select salary from salaries 
   where salaries.emp_no = employees.emp_no and from_date = employees.hire_date) 
group by salaries.emp_no 
limit 10 ;

返回:

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Georgi     | Facello   |
| Chirstian  | Koblick   |
| Kyoichi    | Maliniak  |
| Tzvetan    | Zielinski |
| Sumant     | Peac      |
| Mary       | Sluis     |
| Patricio   | Bridgland |
| Eberhardt  | Terkki    |
| Cristinel  | Bouloucos |
| Kazuhide   | Peha      |
+------------+-----------+
10 rows in set (10.05 sec)

现在我正在尝试同时选择他们被雇用时的薪水(因为它已经在嵌套选择中选择了)。

有没有办法从select salary from salaries where salaries.emp_no = employees.emp_no and from_date = employees.hire_date 获取这些数据?

我尝试过类似...

select first_name, last_name, first_salary.salary 
from salaries join employees on employees.emp_no = salaries.emp_no 
where salaries.from_date > employees.hire_date and salary > 
  (select salary from salaries where salaries.emp_no = employees.emp_no and from_date = employees.hire_date) 
   AS FIRST_SALARY 
group by salaries.emp_no 
limit 10 ;

...但它显然不起作用

(否则我们可以执行 UNION,因为查询已经很长了)。

【问题讨论】:

    标签: mysql select join


    【解决方案1】:

    重新构建您的查询并在选择中添加新列以选择员工的初始工资

    select first_name, 
           last_name ,
           (select top 1 salary 
            from salaries where salaries.emp_no = employees.emp_no 
                                        and from_date = employees.hire_date) AS InitialSalary
    from salaries 
    join employees on employees.emp_no = salaries.emp_no 
                    AND salaries.from_date > employees.hire_date 
                    AND salary > (select salary 
                                  from salaries 
                                  where salaries.emp_no = employees.emp_no 
                                        and from_date = employees.hire_date) 
    group by salaries.emp_no 
    limit 10 ;
    

    【讨论】:

      【解决方案2】:

      一种方法是在薪水上使用 MAX 和 MIN:

      SELECT employees.emp_no, first_name, last_name, MAX(salary), MIN(salary)
      FROM salaries 
      INNER JOIN employees ON employees.emp_no = salaries.emp_no 
      GROUP BY employees.emp_no, first_name, last_name
      HAVING MAX(salary) > MIN(salary)
      

      编辑:如果您想确保最高工资实际上是在比雇用日期更晚的日期出现的,您可以这样做:

      SELECT first_name, last_name
      FROM 
      (SELECT employees.emp_no, first_name, last_name, MAX(salary) AS mxsal
       FROM employees
       INNER JOIN salaries
       ON employees.emp_no = salaries.emp_no
       GROUP BY employees.emp_no, first_name, last_name) highest
      INNER JOIN
      (SELECT employees.emp_no, salary
       FROM employees
       INNER JOIN salaries on employees.emp_no = salaries.emp_no
       WHERE employees.hire_date = salaries.from_date) starting
      ON highest.emp_no = starting.emp_no
      WHERE highest.mxsal > starting.salary
      

      首先我创建了一个“最高”表,其中包含每位员工的最高工资 (mxsal)。然后我加入了一个“起始”表,其中包含每个员工的起薪(starting.salary)。然后只选择最高工资大于起始工资的记录。

      【讨论】:

      • 谢谢。我想过,但它可以选择工资下降的人。这就是为什么我们还应该检查日期(employees.hire_date、salary.from_date、salary.to_date)
      • 我明白你的意思。查看编辑并告诉我您的想法
      • 我不明白为什么,但是 MySQL 返回一个语法错误:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'starting ON[...]
      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2010-12-07
      • 2018-03-08
      • 1970-01-01
      • 2012-12-10
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多