Обновить фамилию сотрудника для всех версий на основе текущей версии - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть следующая таблица:

EmployeeId FirstName LastName       CurrentRecord DepartmentId UpdatedDate
50         Alain     Xavier         0             10           NULL
50         Alain     Xavier         0             15           NULL
50         Alain     Xavier Dupont  1             20           NULL
55         Nathalie  BUC            0             346          NULL
55         Nathalie  BUC Clement    1             346          NULL

Я хочу обновить все фамилии на основе текущей фамилии для каждого сотрудника, как показано ниже, а UpdateDate получает текущую дату изменения:

EmployeeId FirstName LastName       CurrentRecord DepartmentId UpdatedDate
50         Alain     Xavier Dupont  0             10           01/04/2020
50         Alain     Xavier Dupont  0             15           01/04/2020
50         Alain     Xavier Dupont  1             20           01/04/2020
55         Nathalie  BUC Clement    0             346          01/04/2020
55         Nathalie  BUC Clement    1             346          01/04/2020

Как получить круговое соединение в предложении обновления?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Для этого можно использовать обновляемый CTE:

with toupdate as (
      select t.*,
             max(case when currentRecord = 1 then lastname end) over (partition by EmployeeId) as curr_lastname
      from t
     )
update toupdate
     set lastname = curr_lastname,
         updateddate = getdate()
     where curr_lastname <> lastname;

Если вам нужно обновить несколько столбцов, это может быть проще сделать:

update t
    set lastname = curr.lastname,
        updateddate = getdate()
    from t join
         t curr
         on t.EmployeeId = curr.EmployeeId
    where curr.currentRecord = 1;
1 голос
/ 01 апреля 2020

Простой подзапрос может обработать это:

update dbo.Employee set
  LastName = (select E1.LastName from dbo.Employee E1 where E1.CurrentRecord = 1 and E1.EmployeeId = Employee.EmployeeId)
  , UpdatedDate = current_timestamp
where CurrentRecord = 0;
1 голос
/ 01 апреля 2020

SQL Fiddle

SQL Настройка схемы сервера 2017 :

CREATE TABLE Employee (EmployeeId int, FirstName varchar(255), Lastname varchar(255),CurrentRecord bit
                       ,Department int,UpdateDate date)
INSERT INTO Employee(EmployeeId,FirstName,Lastname,CurrentRecord,Department,UpdateDate) VALUES (50,'Alain','Xavier',0,10,NULL),
                            (50,'Alain','Xavier',0,15,NULL),(50,'Alain','Xavier Dupont',1,20,NULL),
                            (45,'Nathalie','Buc',0,346,NULL),(45,'Nathalie','Buc Clement',1,346,NULL)

Запрос 1 :

UPDATE Employee
SET Employee.Lastname=E1.Lastname,UpdateDate=GETDATE()
FROM ( SELECT EmployeeId,Lastname FROM Employee WHERE CurrentRecord=1) AS E1
WHERE E1.EmployeeId=Employee.EmployeeId  

SELECT * FROM Employee

Результаты :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...