У меня есть таблицы с данными сотрудника и его коллег, я хочу обновить bucketid в таблице Employee, если есть соответствующие коллеги с другим сотрудником.self join in update query с транзитивными данными
здесь, в этом примере,
Сотрудник = 101 соответствие с Сотрудника = 103 Коллега (т.е. с1), поэтому оба должны иметь тот же bucketid = 1 (т.е. мин обоих bucketids)
и работник = 102 совпадает с Employee = 103 Colleague (т.е. c3), поэтому оба должны иметь одинаковый bucketid, но здесь он должен быть обновлен с 1, поскольку employee = 102 bucketid только что изменился на 1. В этом примере мы имеем данные, зависящие от закона.
(i.e. a=b and b=c then a=c)
Сотрудник таблице:
EmployeeID EmployeeName BucketID
101 williams 1
102 williams 2
103 williams 3
104 williams 4
Employee_Colleague стол:
EmployeeID Colleague
101 c1
101 c2
102 c3
102 c4
103 c1
103 c3
104 c7
Я попытался с помощью этого запроса на обновление,
update a2
set BucketID = a1.BucketID
from Employee a1
inner join Emp_Colleagues c1 on a1.EmployeeID=c1.EmployeeID
inner join Employee a2 on a1.EmployeeName=a2.EmployeeName
inner join Emp_Colleagues c2 on a2.EmployeeID=c2.EmployeeID
where c1.Colleague=c2.Colleague and a1.BucketID <> a2.BucketID
она возвращается ниже выхода.
EmployeeID EmployeeName BucketID
101 williams 1
102 williams 1
103 williams 3
104 williams 4
Но я хочу выход, как показано ниже в таблице Employee.
EmployeeID EmployeeName BucketID
101 williams 1
102 williams 1
103 williams 1
104 williams 4
В чем проблема с запросом? –
возвращает упомянутый выше вывод, а не тот, который я действительно хотел. – user3789961
Для этого нужен рекурсивный CTE, так как может существовать неопределенное количество переходов, например 'a = b и b = c и c = d', затем' a = d'. –