我在员工和他的同事数据下面有表格,我想在员工表中更新bucketid,如果有匹配的同事与其他员工。
这个例子中,
Employee = 101与Employee = 103同事(即c1)匹配,因此两者都应该具有相同的bucketid = 1(即两个bucketids的分钟)
和Employee = 102与Employee = 103同事(即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
答案 0 :(得分:1)
我认为你不能在一个更新声明中这样做。但是,您可以使用循环来保持更新,直到没有任何内容可以更新:
declare @updates int = 1
while @updates > 0
begin
update a2
set BucketID = a1.BucketID
from Employee a1
inner join Emp_Colleagues c1 on a1.EmployeeID=c1.EmployeeID
inner join Emp_Colleagues c2 on c1.Colleague=c2.Colleague
inner join Employee a2 on a2.EmployeeID=c2.EmployeeID
where a1.BucketID < a2.BucketID
set @updates = @@ROWCOUNT
end
答案 1 :(得分:0)
以下是您要查找的查询。
with CTE as
(
select EmployeeID as E1, EmployeeID as E2, cast('\' as varchar(MAX)) as list
from Employee
Union all
select E1, T2_2.EmployeeID, CTE.list + CAST(E1 as varchar(MAX)) + '-' + CAST(T2_2.EmployeeID as varchar(MAX)) + '\'
from CTE
inner join Employee_Colleague T2_1 ON CTE.E2 = T2_1.EmployeeID
inner join Employee_Colleague T2_2 ON T2_1.Colleague = T2_2.Colleague
where CTE.list not like '%\' + CAST(E1 as varchar(MAX)) + '-' + CAST(T2_2.EmployeeID as varchar(MAX)) + '\' +'%'
)
Update T1_1
Set T1_1.BucketID = (select MIN(T1_2.BucketID)
from Employee T1_2
inner join CTE ON T1_1.EmployeeID = CTE.E1 AND T1_2.EmployeeID = CTE.E2
)
from Employee T1_1