我有一个table A
,有两个主要栏目:Name
和Settings
。 Settings
列将具有3个值:1,2或3。
例如:
表A:
Name Settings
Andre 1
Andre 1
Betty 3
Charles 1
Charles 1
请注意,1 Name
只能有1个Settings
:1,2或3。
我有另外一个table B
,有两个主要栏目:Name
和Type
。 Type
专栏由许多值组成,如:'TypeA'
,'TypeB'
,'TypeC'
......
例如:
表B:
Name Type
Andre TypeA
Andre TypeA
Andre TypeC
Betty TypeB
Betty TypeB
Betty TypeD
Charles TypeB
Charles TypeA
Charles TypeA
.....
请注意,1 Name
可以有多个相同或不同的Type
。而我们只是考虑关于TypeA
和TypeB
。
现在我想使用Settings
中的table A
列从'Type'
更新table B
列,如果:
Type
的table B
列具有'TypeA'
的值,然后更新所有记录,从两个表中具有相同的Name
,在Settings
的table A
列上更新为1。Type
的table B
列具有'TypeB'
的值,然后更新所有记录,从两个表中具有相同的Name
,到Settings
的table A
列上的2。Type
的table B
列具有'TypeA'
和'TypeB'
的值,然后更新所有记录,从两个表中具有相同的Name
,到Settings
的table A
列上的3。table A
的结果应该是这样的:
Name Settings
Andre 1
Andre 1
Andre 1
Betty 2
Charles 3
Charles 3
我该怎么做?
我相信聚合的相关子查询可能会完成工作,例如:
UPDATE ta
SET Settings = (
SELECT
CASE
WHEN MAX(tb.Type) = 'TypeA' AND MIN(tb.Type) = 'TypeA' THEN 1
WHEN MAX(tb.Type) = 'TypeB' AND MIN(tb.Type) = 'TypeB' THEN 2
ELSE 3
END
FROM TableB tb
WHERE tb.Name = ta.Name AND Type in ('TypeA', 'TypeB')
GROUP BY tb.Name
)
FROM TableA ta
在这个带有样本数据的demo on DB Fiddle中,这是TableA
执行后的UPDATE
的内容:
Name | Settings :------ | -------: Andre | 1 Andre | 1 Betty | 2 Charles | 3 Charles | 3
更新可以加入一个子查询,该查询为TableB的每个名称计算这些类型。 然后可以基于这些总计计算新的“设置”。
UPDATE a
SET a.Settings = (CASE
WHEN b.TotalTypeA > 0 AND b.TotalTypeB > 0 THEN 3
WHEN b.TotalTypeB > 0 THEN 2
WHEN b.TotalTypeA > 0 THEN 1
ELSE 0
END)
FROM TableA a
LEFT JOIN
(
SELECT Name,
COUNT(CASE WHEN Type = 'TypeA' THEN 1 END) TotalTypeA,
COUNT(CASE WHEN Type = 'TypeB' THEN 1 END) TotalTypeB
FROM TableB
GROUP BY Name
) b
ON b.Name = a.Name;
对RexTester here的测试