【问题标题】:Find Last Updated By and Last Update Date查找上次更新日期和上次更新日期
【发布时间】:2015-06-30 12:23:38
【问题描述】:

我被告知要为以下情况提出解决方案。

我需要根据“EmployeeID”返回“上次更新日期”和“上次更新者”列。查询必须在父表和所有子表中搜索最新条目并返回按 ID 分组的列。我正在寻找一种不使用 UNION ALL 来连接父表和子表的解决方案,以及一种处理以下情况的解决方案:两个不同的用户可以在不同表上的同一 EmployeeID(外键或主键)上输入最新记录。

例如Jim 今天更新了 Employee 表的 EmployeeID 1,Paul 也更新了 Employee_Address 表的 EmployeeID 1。基于该 EmployeeID 1 有两条记录,其最后更新日期为今天,由不同的用户输入。

请参阅架构和 Union ALL 脚本,其中我无法找出其中的 Last Updated By 部分。

CREATE TABLE EMPLOYEE
(
  EMPLOYEE_ID INT,
  NAME VARCHAR(100),
  LAST_UPDATED_BY VARCHAR(200),
  LAST_UPDATED_DT DATE
)

CREATE TABLE EMPLOYEE_AWARD
(
  AWARD_ID INT,
  EMPLOYEE_ID INT,
  AWARD_NAME VARCHAR(100),
  LAST_UPDATED_BY VARCHAR(200),
  LAST_UPDATED_DT DATE
)

CREATE TABLE EMPLOYEE_ADDRESS
(
  ADDRESS_ID INT,
  EMPLOYEE_ID INT,
  "ADDRESS" VARCHAR(100),
  LAST_UPDATED_BY VARCHAR(200),
  LAST_UPDATED_DT DATE
)


INSERT INTO EMPLOYEE
    VALUES  (1,'Paul Smith', 'GomesR', '6/22/2015'),
            (2,'Francis Jones', 'KellyR', '5/20/2013'),
            (3,'Paul Bo', 'GomesR', '11/09/2015'),
            (4,'Ed Li', 'TurnerR', '1/19/2012')


INSERT INTO EMPLOYEE_AWARD
    VALUES  (10,1,'Employee of the Month', 'GomesR', '6/22/2015'),
            (20,3,'Employee of the Month', 'KellyR', '5/20/2013'),
            (30,1,'Employee of the Quater', 'GomesR', '11/09/2015'),
            (40,3,'Employee of the Month', 'TurnerR', '1/19/2012'),
            (50,2,'Employee of the Month', 'KellyR', '11/11/2011')


INSERT INTO EMPLOYEE_ADDRESS

    VALUES  (100,1,'Address 1','GomesR', '6/25/2015'),
            (200,2,'Address 2','TurnerR', '5/28/2015'),
            (300,3,'Address 3','TurnerR', '11/20/2015'),
            (400,4,'Address 4','GomesR', '6/14/2014')



SELECT      D.EMPLOYEE_ID, Max(D.LAST_UPDATED_DT) LAST_UPDATED_DT--, D.LAST_UPDATED_BY
FROM        EMPLOYEE A

INNER JOIN  (   SELECT      EMPLOYEE_ID, LAST_UPDATED_DT, LAST_UPDATED_BY
                FROM        EMPLOYEE 
                UNION ALL
                SELECT      EMPLOYEE_ID, LAST_UPDATED_DT, LAST_UPDATED_BY
                FROM        EMPLOYEE_AWARD 
                UNION ALL
                SELECT      EMPLOYEE_ID, LAST_UPDATED_DT, LAST_UPDATED_BY
                FROM        EMPLOYEE_ADDRESS

                ) AS D

ON A.EMPLOYEE_ID = D.EMPLOYEE_ID
GROUP BY D.EMPLOYEE_ID

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    如果需要,如果在 2 个不同的表上 2 个不同的用户在同一天更新了一个员工,这将为同一员工返回 2 行。

    select employee_id,
           last_updated_dt,
           last_updated_by
      from (select x.*,
                   max(last_updated_dt) over(partition by employee_id) as max_last_updated_dt
              from (select employee_id,
                           last_updated_dt,
                           last_updated_by
                      from employee
                    union all
                    select employee_id,
                           last_updated_dt,
                           last_updated_by
                      from employee_award
                    union all
                    select employee_id,
                           last_updated_dt,
                           last_updated_by
                      from employee_address) x) x
     where last_updated_dt = max_last_updated_dt
    

    小提琴:http://sqlfiddle.com/#!3/a4503c/1/0

    您不应避免使用union all。数据位于三个不同的表中,因此这是 union all 的适当应用。

    【讨论】:

      【解决方案2】:

      为什么要使用UNION ALLJOINs 会很好地完成你的工作。

      SELECT e.employee_id,
             e.last_updated_dt AS employee_update_date,
             e.last_updated_by AS employee_update_user,
             aw.last_updated_dt AS awards_update_date,
             aw.last_updated_by AS awards_update_user,
             ad.last_updated_dt AS address_update_date,
             ad.last_updated_by AS address_update_user
      FROM employee e
      LEFT JOIN employee_awards aw ON e.employee_id = aw.employee_id
      LEFT JOIN address ad ON e.employee_id = ad.employee_id
      

      我使用LEFT JOINs 来保证稳健性,因为我假设并非所有员工在所有表中都有条目。

      【讨论】:

      • 他想要更改每个员工的最后一个用户以及他们执行更改的日期。如果 2 个以上的用户(在同一天进行更改)之间存在平局,他想要两者。这与此查询无关。 (sqlfiddle.com/#!3/a4503c/4/0)
      猜你喜欢
      • 2017-01-29
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      相关资源
      最近更新 更多