【问题标题】:Oracle - Update rows with a min value in the group of a column from another tableOracle - 用另一个表的列组中的最小值更新行
【发布时间】:2016-04-06 07:41:14
【问题描述】:

我正面临这种情况:表 Employee 有 join_date 列。表 Booking 具有 booking_date 列和 Employee 的外键 (employee_id)。 Employee 在其加入日期列中有一些 NULL 值。我想用这些员工的 FIRST booking_date 值填充它们。我该怎么办?

仅供参考: 我可以使用复杂的 join 语句来提取 join_date 为 NULL 的员工的第一个 booking_date,如下所示:

SELECT emp.employee_id, emp.joining_date, temp2.booking_date FROM employee emp
  LEFT JOIN (SELECT bo.employee_id, bo.booking_date FROM booking bo
    INNER JOIN (SELECT employee_id, MIN(booking_date) mindate FROM booking GROUP BY employee_id) temp1
    ON bo.employee_id = temp1.employee_id AND bo.booking_date = temp1.mindate) temp2
  ON emp.employee_id = temp2.employee_id
WHERE emp.joining_date IS NULL;

但我很难将这个复杂的选择放入更新语句:

UPDATE employee emp
SET emp.joining_date = (SELECT ...)
WHERE emp.joining_date IS NULL;

【问题讨论】:

    标签: oracle


    【解决方案1】:

    您的选择语句比它需要的更复杂,您将通过这种方式获得相同的集合:

    SELECT emp.employee_id,min(bo.booking_date) booking_date
    FROM employee emp
      LEFT JOIN booking bo 
      ON bo.employee_id = emp.employee_id
    WHERE emp.joining_date is NULL
    GROUP BY emp.employee_id;
    

    您的更新可以这样完成,请注意“并且存在”部分是可选的,但我倾向于包含它以使查询的意图更加清晰。

    UPDATE employee emp
      SET emp.joining_date = 
        (SELECT min(booking_date) from booking bo where bo.employee_id = emp.employee_id)
    WHERE emp.joining_date IS NULL
      and exists(select * from booking bo where bo.employee_id = emp.employee_id);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-13
      • 2021-09-22
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      相关资源
      最近更新 更多